算法训练1-day12-二叉树

29 阅读1分钟

今天是二叉树

  1. 226. 翻转二叉树

AC代码:

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if (root == nullptr)
            return nullptr;

        TreeNode* node = root->left;
        root->left = root->right;
        root->right = node;

        invertTree(root->left);
        invertTree(root->right);

        return root;
    }
};

2. 101. 对称二叉树

这道题关键的点在于我们要判断左右子树是否是对称的,也就是说我们要比较的是两个树,因此,我们要同时比较左和右,如果它们都不为空切值相等,那么我们再判断左边的与右边的右边是否相等,以及左边的右边与右边的左边是否相等

AC代码:

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(root == nullptr) return true;

        return compare(root->left, root->right);
    }

    bool compare(TreeNode* left, TreeNode* right)
    {
        if(left == nullptr && right == nullptr) return true;
        else if(left != nullptr && right == nullptr) return false;
        else if(left == nullptr && right != nullptr) return false;
        else if(left->val != right->val) return false;

        bool isLeftSame = compare(left->left, right->right);
        bool isRightSame = compare(left->right, right->left);

        return isLeftSame && isRightSame;
    }
};
  1. 104. 二叉树的最大深度

层序遍历

AC代码:

class Solution {
public:
    int maxDepth(TreeNode* root) {
        if (root == nullptr) return 0;
        queue<TreeNode*> nodes;
        int depth = 0;
        nodes.push(root);
        TreeNode* node = nullptr;
        while (!nodes.empty()) {
            int size = nodes.size();
            for (int i = 0; i < size; ++i) {
                node = nodes.front();
                nodes.pop();

                if (node->left != nullptr) nodes.push(node->left);
                if (node->right != nullptr) nodes.push(node->right);
            }
            depth++;
        }

        return depth;
    }
};
  1. 111. 二叉树的最小深度

和最大深度类似,变化的点在于每次弹出节点时判断一下是否是叶子节点,如果是,就中断搜索

class Solution {
public:
    int minDepth(TreeNode* root) {
        if (root == nullptr) return 0;
        queue<TreeNode*> nodes;
        int depth = 0;
        nodes.push(root);
        TreeNode* node = nullptr;
        while (!nodes.empty()) {
            int size = nodes.size();
            depth++;
            bool found = false;
            for (int i = 0; i < size; ++i) {
                node = nodes.front();
                nodes.pop();
                
                if(node->left == nullptr && node->right == nullptr){
                    found = true;
                    break;
                }
                if (node->left != nullptr) nodes.push(node->left);
                if (node->right != nullptr) nodes.push(node->right);
            }
            if(found) break;
        }

        return depth;
    }
};