代码随想录 day 14 二叉树part02

226.翻转二叉树 

题目链接/文章讲解/视频讲解:代码随想录

节点交换也可以用swap

class Solution {

public:

    TreeNode* invertTree(TreeNode* root) {

        if (root == NULL) return root;

        swap(root -> left, root -> right);

        invertTree(root -> left);

        invertTree(root -> right);

        return root;

    }

};

101. 对称二叉树 

题目链接/文章讲解/视频讲解:代码随想录 

为什么要用后序遍历?

我们要比较的是两课子树的内外侧节点,例如左子树的右节点和右子树的左节点是否下是否相等,左子树的右节点和右子树的左节点是否相等,将处理的信息返回给上层,所有遍历顺序只能是后序

要按内外侧处理

class Solution {

public:

    bool isS(TreeNode* left, TreeNode* right) {

        if(left == NULL && right != NULL) return false;

        else if(left != NULL && right == NULL) return false;

        else if(left == NULL && right == NULL) return true;

        // 数值不相等也为假,这行一定得在前三行判断完后,因为改行的前提条件左右节点都不为空

        else if(left -> val != right -> val) return false;

        // 外侧

        bool lef = isS(left -> left, right -> right);

        // 内侧

        bool rig = isS(left -> right, right -> left);

        // 同时成立

        bool isSym = lef && rig;

        return isSym;

    }

    bool isSymmetric(TreeNode* root) {

        if(root == NULL) return false;

        return isS(root -> left, root -> right);

    }

};

104.二叉树的最大深度

题目链接/文章讲解/视频讲解: 代码随想录 

层序遍历最大深度即层数

    int maxDepth(TreeNode* root) {

        int res = 0;

        if (root == NULL) return res;

        queue<TreeNode*> q;

        q.push(root);

        while (!q.empty()) {

            int _size = q.size();

            TreeNode* node;

            for (int i = 0; i < _size; i++) {

                node = q.front();

                q.pop();

                if (node -> left) q.push(node -> left);

                if (node -> right) q.push(node -> right);

            }

            res++; // 记录层数

        }

        return res;

    }

递归法:

后序遍历求高度(即最大深度)

前序遍历求深度

后序是记录沿着条某一条路径递归到底走过的节点数量,取左右路径中的最大值

    int pretravel(TreeNode* cur) {

        if (cur == NULL) return 0;

        int num1 = pretravel(cur -> left);

        int num2 = pretravel(cur -> right);

        int depth = 1 + max(num1, num2);

        return depth;

    }

    int maxDepth(TreeNode* root) {

        return pretravel(root);

    }

前序则是每次递归都要更新深度

111.二叉树的最小深度

题目链接/文章讲解/视频讲解:代码随想录

层序遍历

    int minDepth(TreeNode* root) {

        queue<TreeNode*> q;

        if (root != NULL) q.push(root);

        int depth = 0;

        while (!q.empty()) {

            int _size = q.size();

            depth++;

            for(int i = 0; i < _size; i++) {

                TreeNode* node = q.front();

                q.pop();

                if (node -> left == NULL && node -> right == NULL) { // 没有左右孩子说明出现叶子节点返回深度

                    return depth;

                }else {

                    if (node -> left) q.push(node -> left);

                    if (node -> right) q.push(node -> right);

                }

            }

        }

        return depth;

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值