代码随想录算法训练营Day14 | Leetcode224 翻转二叉树 Leetcode101 对称二叉树 Leetcode104 二叉树的最大深度 Leetcode 111 二叉树的最小深度

前言

二叉树的题目确定遍历顺序很关键,此外递归逻辑可以简化成只有根节点的处理情况,非递归好像用层序遍历都可以解决,但要等到二刷的时候再处理了。

Leetcode224 翻转二叉树

题目链接:226. 翻转二叉树 - 力扣(LeetCode)

代码随想录题解:代码随想录 (programmercarl.com)

思路:先确定遍历顺序,前序和后序都可以,前序的逻辑是从上到下翻转而后序的逻辑是从下到上翻转。递归逻辑简化只有根结点的处理情况就是传入根节点,翻转左右孩子,传入左孩子和右孩子

代码:

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
    if(root==NULL)
    {
        return NULL;
    }                                    //前序遍历
        swap(root->left, root->right);  // 中
        invertTree(root->left);         // 左
        invertTree(root->right);        // 右
        return root;
    }
};

 Leetcode101 对称二叉树

题目链接:101. 对称二叉树 - 力扣(LeetCode)

代码随想录题解:代码随想录 (programmercarl.com)

思路:先确定遍历顺序,这个题其实在两个树上遍历,一个是左右中,一个是右左中,但其实不重要。简化递归为只有根节点分情况:先传入根节点的左右,左空右不空,左不空右空,左右都不空但数值不等,左右都空。前三种都不对称,只有第四种对称。这里需要注意左右都不空且数值相等,这时候不能直接推断对称,还必须判断他们下面的节点是否也对称。

代码:

class Solution {
public:
    bool compare(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;
        }
        else  return compare(left->left,right->right)&&compare(left->right,right->left);
    }  //左右不空且数值相等 需要判断下面节点的情况
    bool isSymmetric(TreeNode* root) {
    if(root==NULL)
    {
        return true;
    }
    return compare(root->left,root->right);
    }

};

Leetcode104 二叉树的最大深度

题目链接:104. 二叉树的最大深度 - 力扣(LeetCode)

代码随想录题解:代码随想录 (programmercarl.com)

思路:求深度就是一直往下,所以很明显是左右中,把左右的深度结果返回给中。递归简化:传入根节点,求左右子树的深度,返回最大值给根节点。

代码:

class Solution {
public:
    int maxDepth(TreeNode* root) {
    if(root==NULL)
    {
        return 0;
    }
    int leftdepth=maxDepth(root->left);
    int rightdepth=maxDepth(root->right);
    int depth=1+max(leftdepth,rightdepth);
    return depth;
    }
};

 Leetcode 111 二叉树的最小深度

题目链接:111. 二叉树的最小深度 - 力扣(LeetCode)

代码随想录题解:代码随想录 (programmercarl.com)

思路:求深度基本一样,但要注意最小深度是根节点到叶子节点。所以,如果左子树为空,右子树不为空,说明最小深度是 1 + 右子树的深度。反之,右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。 最后如果左右子树都不为空,返回左右子树深度最小值 + 1 。

代码:

class Solution {
public:
    int minDepth(TreeNode* root) {
    if(root==NULL)
    {
        return 0;
    }
    int leftdepth=minDepth(root->left);
    int rightdepth=minDepth(root->right);
    if(root->left==NULL&&root->right!=NULL)
    {
        return 1+rightdepth;
    }
    if(root->left!=NULL&&root->right==NULL)
    {
        return 1+leftdepth;
    }
    return 1+min(leftdepth,rightdepth);
    }
};

总结

二叉树的题要理解遍历顺序和递归逻辑才能更好的记忆。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值