代码随想录算法训练营第12天|226. 翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

LeetCode226

题目描述:力扣226
文档讲解:代码随想录(programmercarl)226. 翻转二叉树
视频讲解:《代码随想录》算法视频公开课:听说一位巨佬面Google被拒了,因为没写出翻转二叉树 | LeetCode:226.翻转二叉树

代码随想录视频内容简记

翻转一颗二叉树,首选还是递归的方式,可以使用前、中、后序遍历。最重要的是搞明白自己使用的是那种遍历方式

梳理

  1. 确定递归三部曲,函数的参数和返回值,递归的终止条件,单层递归的逻辑

  2. 之后前序和后序的代码基本一样的

  3. 中序。中序需要对代码做一点改动,因为中序在进行翻转的过程中,在对左子树翻转之后,会对根结点进行翻转,此时,要处理的右子树成了翻过来的左子树。如果再处理右子树,反而不对,因此,还要处理的是左子树

LeetCode测试

前序遍历

点击查看代码
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;
    }
};

中序遍历

点击查看代码
class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if (root == NULL) return NULL;
        invertTree(root->left);
        swap(root->left, root->right);
        invertTree(root->left);
        return root;
    }
};

LeetCode101

题目描述:力扣101
文档讲解:代码随想录(programmercarl)101. 对称二叉树
视频讲解:《代码随想录》算法视频公开课:同时操作两个二叉树 | LeetCode:101. 对称二叉树

代码随想录视频内容简记

这道题目是判断二叉树是否对称,其实也就是判断这棵二叉树的左子树翻转过来是否能够和右子树重合。这道题目特殊的点就在于要同时对两棵树进行遍历,也就是根节点的左子树和右子树

对于二叉树类的题目,如果要将这一层的结点反馈给上一层结点,就用到了后序遍历。依旧是递归三部曲

梳理

  1. 确定递归的参数和返回值

  2. 确定递归的终止条件,大致可以分成这么几种情况

    1. 根节点左孩子为空,右孩子为空True
    2. 根结点左孩子为空,有孩子不为空False
    3. 根结点左孩子不为空,有孩子为空False
    4. 根节点左孩子的值和右孩子的值不一样False
  3. 确定单层递归的逻辑。这里需要进行一个后序遍历

大致代码内容

  1. 首先得定义一个新的compare函数,使用两个参数,一个是左结点,一个是右结点

  2. 确定递归的终止条件

    1. if (left == NULL && right == NULL) return True

    2. if (left == NULL && right != NULL) return False

    3. if (left != NULL && right == NULL) return False

    4. if (left->val != right->val) return False

  3. 确定单层递归的逻辑

首先比较外侧,这里也就是左子树的L(右子树的R)
bool outside = compare(left->left, right->right)
之后再比较内侧,左子树的R(右子树的L)
bool inside = compare(left->right, right->left)
最后再看上一步比较的结果,也就是左子树的N(右子树的N)
bool result = outside && inside

LeetCode测试

这道题给我的启示就是要把递归的终止条件罗列清楚,明白,因为这个题有四个if

点击查看代码
class Solution {
public:
    bool compare(TreeNode* left, TreeNode* right) {
        if (left == NULL && right == NULL) return true;
        if (left == NULL && right != NULL) return false;
        if (left != NULL && right == NULL) return false;
        if (left->val != right->val) return false;
        bool outside = compare(left->left, right->right);
        bool inside = compare(left->right, right->left);
        bool result = outside && inside;
        return result;
    }

    bool isSymmetric(TreeNode* root) {
        bool result = compare(root->left, root->right);
        return result;
    }
};

LeetCode104

题目描述:力扣104
文档讲解:代码随想录(programmercarl)104.二叉树的最大深度
视频讲解:《代码随想录》算法视频公开课:二叉树的高度和深度有啥区别?究竟用什么遍历顺序?很多录友搞不懂 | 104.二叉树的最大深度

代码随想录视频内容简记

k哥说了,正常来讲,求深度用前序遍历,求高度用后序遍历。而这道题之所以能用后序遍历,就是因为根节点的高度就是这棵二叉树的深度,还有一个原因就是前序求深度的代码比较复杂。

梳理

  1. 确定函数的参数和返回值,传入树的根结点即可

  2. 确定递归的终止条件

  3. 确定单层递归的逻辑,分别向左和右进行遍历即可

大致代码内容

  1. 定义一个maxDepth(TreeNode* root)

  2. 终止条件是if (cur == NULL) return 0;

  3. int lheight = maxDepth(cur->left)这个求左子树的,int rheight = maxDepth(cur->right)这个求右子树的,最后的根结点是int height = 1 + max(lheight, rheight)

LeetCode测试

求二叉树的最大深度代码如下,代码很简洁,一遍写出来直接可以通过

点击查看代码
class Solution {
public:
    int maxDepth(TreeNode* root) {
        TreeNode* cur = root;
        if (cur == NULL) return 0;
        int lheight = maxDepth(cur->left);
        int rheight = maxDepth(cur->right);
        int height = 1 + max(lheight, rheight);
        return height;
    }
};

LeetCode111

题目描述:力扣111
文档讲解:代码随想录(programmercarl)111.二叉树的最小深度
视频讲解:《代码随想录》算法视频公开课:看起来好像做过,一写就错! | LeetCode:111.二叉树的最小深度

代码随想录视频内容简记

题目要求的是二叉树的的最小深度,关于最小深度的定义,力扣上如是:

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

而最大深度是

最大深度是指从根节点到最远叶子节点的最长路径上的节点数。

在本题中,思路是和之前的二叉树的最大深度是一致的,同样是用后序遍历,将求二叉树的最小深度转换为求二叉树的最小高度,遍历到最短叶子结点的上一个根节点(既有左子树,又有右子树)

梳理

  1. 确定函数的参数和返回值

  2. 确定递归的终止条件

  3. 确定单层递归的逻辑

大致代码内容

  1. 依旧是定义一个getHeight(TreeNode* root)函数

  2. 递归的出口就是if (root == NULL) return 0;这里的0是有意义的,表示此时的结点高度是0,之后进入递归依次加

  3. 单层递归的情况,这个有一个坑🕳。就是在定义完左右的遍历之后,对进行处理,不能像之前的最大深度一样,直接用1+min(),因为对于一棵树是空,另一棵树不空的情况,这样处理的结果就是0+1=1

    所以,if (root->left == NULL && root->right != NULL) return 1 + rheight,而对if (root->left != NULL && u'root->right == NULL) return 1 + lheightif (root->left != NULL && root->right != NULL) return 1+min(lheight, rheight)

LeetCode测试

点击查看代码
class Solution {
public:
    int minDepth(TreeNode* root) {
        if (root == NULL) return 0;
        int lheight = minDepth(root->left);
        int rheight = minDepth(root->right);
        int result;
        if (root->left == NULL && root->right != NULL) return 1 + rheight;
        if (root->left != NULL && root->right == NULL) return 1 + lheight;
        if (root->left != NULL && root->right != NULL) result = 1 + min(lheight, rheight);
        return result;
    }
};
posted on   bnbncch  阅读(1476)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示