代码随想录刷题day12 | LeetCode 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度

226.翻转二叉树 

​​​​​​力扣题目链接​​​​​听说一位巨佬面Google被拒了,因为没写出翻转二叉树 | LeetCode:226.翻转二叉树

1.  if(root==nullptr)        return root;

指的是跳出当前递归,并不是结束函数。

 2.  swap(root->left,root->right);函数交换两个子树,并不是两个值。

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

101. 对称二叉树

力扣题目链接

同时操作两个二叉树 | LeetCode:101. 对称二叉树

 注意避免空指针如: if(right==nullptr&&left==nullptr)  return true;

 两空不能和两个相等的值一起算,要避免空指针。 

不需要显性的写两值相等就是true,至于为什么呢?

我的解释是若两值相等则直接return compare(nullptr,nullptr)&&compare(nullptr,nullptr);

该结果为true,若直接写两值相等返回ture,可能会遗漏对称性的全面检查。

class Solution {
public:
    bool compare(TreeNode* left,TreeNode* right)
    {
        if(left!=nullptr&&right==nullptr)   return false;    
        if(right!=nullptr&&left==nullptr)   return false;
        if(right==nullptr&&left==nullptr)   return true;
        if(right!=nullptr&&left!=nullptr&&right->val!=left->val)   return false;
        return compare(left->left,right->right)&&compare(left->right,right->left);
    }
    bool isSymmetric(TreeNode* root) {
        if(root==nullptr)
        return true;
        return compare(root->left,root->right);
    }
};

 104.二叉树的最大深度

力扣题目链接

二叉树的高度和深度有啥区别?究竟用什么遍历顺序?很多录友搞不懂 | 104.二叉树的最大深度

求深度用前序遍历,高度用后序遍历。 

最大深度即根节点的高度。

if(root==nullptr)        return 0;

返回0指的是返回所在的递归结果为0,而不是结束函数。

class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(root==nullptr)
            return 0;
        int leftget=maxDepth(root->left);
        int rightget=maxDepth(root->right);
        int res=max(leftget,rightget)+1;
        return res;
    }
};

 111.二叉树的最小深度

力扣题目链接

​​​​​​看起来好像做过,一写就错! | LeetCode:111.二叉树的最小深度

与104.求最大深度思路相同,但有些区别

需要注意有两种特殊情况 :

根节点的左右孩子其中一个为空时,求min()+1时容易算成深度为1。

下图为其中一种情况:左孩子为空

class Solution {
public:
    int minDepth(TreeNode* root) {
        if(root==nullptr)
            return 0;
        int leftget=minDepth(root->left);
        int rightget=minDepth(root->right);
        int res=min(leftget,rightget)+1;
        if(root->right==nullptr)
            return leftget+1;
        if(root->left==nullptr)
            return rightget+1;
        return res;
    }
};

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值