代码随想录算法训练营第十四天| 226.翻转二叉树 、101. 对称二叉树、104.二叉树的最大深度 (优先掌握递归)、111.二叉树的最小深度

二叉树学习2

226题翻转二叉树,改一下前序递归遍历,每次遍历的时候都调换一下左右结点即可。

class Solution {
public:
void preorder(TreeNode *root) {
        if (root == nullptr) {
            return;
        }
        TreeNode* tmp;
        tmp = root->left;
        root->left = root->right;
        root->right = tmp;
        preorder(root->left);
        preorder(root->right);
    }
    TreeNode* invertTree(TreeNode* root) {
        preorder(root);
        return root;
    }
};

101判定是不是对称二叉树,我的做法太麻烦了,对两棵树分别遍历(中左右 中右左),再比较值是否相同,其实可以放在一个函数里一次性解决。

class Solution {
public:
    void preorder1(TreeNode *root, vector<int> &res) {
        if (root == nullptr) {
            res.push_back(-101);
            return;
        }
        res.push_back(root->val);
        preorder1(root->left, res);
        preorder1(root->right, res);
    }
    void preorder2(TreeNode *root, vector<int> &res) {
        if (root == nullptr) {
            res.push_back(-101);
            return;
        }
        res.push_back(root->val);
        preorder2(root->right, res);
        preorder2(root->left, res);

    }
    bool isSymmetric(TreeNode* root) {
        
        vector<int> res;
        vector<int> ans;
       
        preorder1(root->left, res);
        preorder2(root->right, ans);
        
        // 比较两个数组
        for (int i = 0; i < res.size(); i++) {
            if (res[i] != ans[i])  
                return false;
        }
        return true;
    }
};

104题二叉树的最大深度 111题二叉树的最小深度在上一节完成了

class Solution {
public:
    int maxDepth(TreeNode* root) {
        queue<TreeNode*> que;
        if (root != NULL) que.push(root);
        vector<vector<int>> result;
        int depth = 0;
        while (!que.empty()) {
            int size = que.size();
            vector<int> vec;
            // 这里一定要使用固定大小size,不要使用que.size(),因为que.size是不断变化的
            for (int i = 0; i < size; i++) {
                TreeNode* node = que.front();
                que.pop();
                vec.push_back(node->val);
                if (node->left) que.push(node->left);
                if (node->right) que.push(node->right);
            }
            result.push_back(vec);
            depth++;
        }
        return depth;
    }
};
class Solution {
public:
    int minDepth(TreeNode* root) {
        if (!root) {
            return 0;
        }
        queue<TreeNode*> que;
        que.push(root);
        
        int depth = 0;

        while (!que.empty()) {
            int size = que.size();
            vector<int> vec;
            // 这里一定要使用固定大小size,不要使用que.size(),因为que.size是不断变化的
            for (int i = 0; i < size; i++) {
                TreeNode* node = que.front();
                que.pop();
                vec.push_back(node->val);
                if (!node->left && !node->right) {
                    return ++depth;
                }
                if (node->left) que.push(node->left);
                if (node->right) que.push(node->right);
            }
            depth++;
        }
        return depth;
    }
};
posted @   清源风起时  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示