代码随想录算法训练营二刷第8天 | 二叉树的对称以及深度

对称二叉树

  1. 这道题需要用两个指针分别从根节点的左、右两个方向去判断是否对称,一旦有遇到不对称的即为 非对称二叉树
  2. 可以用层序遍历,将每一层的节点收集到一个vector数组中并用双指针法判断其是否对称;可以用递归的方法,相当于判断根节点的左右两个子树是否是可以相互翻转的。
  3. 对称二叉树的处理内容就是判断,判断根节点的左右两个子树时候是可以相互翻转的,也就是 判断某个节点能否与另一个节点对称;
  4. 对于递归的方法而言,由于判断的逻辑是:必须先判断根节点的左右两个子树是否可以翻转,才能判断出以根节点为跟的树是否是对称的,那么就有点自下而上的意思了,因此只能后序遍历

二叉树的最大深度

方法一:层序遍历,很好做,只要统计二叉树遍历的层数即可得到最大深度。

方法二:深度优先即递归法,通常,求高度用后序遍历;求深度用的是前序遍历。

1、首先可采用层序遍历,而且思路很简单

2、其次要 明确二叉树的深度,是指每个节点到根节点的节点数量。二叉树的最大深度就是最低一层的叶子节点到跟节点的节点数量。最大深度的本质其实就是:从所有的叶子节点出发,往根节点的方向搜索,其中经过节点数量最大的就是最大深度!因此用递归也可以,由于是从叶子节点向根节点层层返回高度!所以说只能用后序遍历!

class Solution {
public:
    int maxDepth(TreeNode* root) {
        //首先可采用层序遍历,而且思路很简单
        //首先明确二叉树的深度,是指每个节点到根节点的节点数量
        //二叉树的最大深度就是最低一层的叶子节点到跟节点的节点数量
        //最大深度的本质其实就是:从所有的叶子节点出发,往根节点的方向搜索
        //其中节点数量最大的就是最大深度!
        //用递归也可以,由于是从叶子节点向根节点层层返回高度!因此只能用后序
        //递归方法中每层返回到就是一个数值,表示从叶子节点到当前节点已经经过的节点数量!
        //因此递归返回值类型为int型,参数为根节点
        if (root == nullptr) return 0;
        int leftDepth = maxDepth(root->left);
        int rightDepth = maxDepth(root->right);
        int res = max(leftDepth, rightDepth) + 1;
        return res;
    }
};

二叉树的最小深度

方法一:层序遍历,很好做,遇到左右孩子均为空的情况就返回层数即可。

方法二:深度优先递归法,求二叉树的最小深度和求二叉树的最大深度的差别主要在于处理左右孩子不为空的逻辑。

此处总结以下递归的思想:

以上面两题为例,对根节点而言,求最小深度就是要求最小的高度,要 求根节点的最大/最小高度,就要求左右子树的最大/最小高度,得到左右子树的最大/最小高度以后 + 1;然后要 求左子树的根节点的最大/最小高度,······,最终递归到了叶子节点:要得到叶子节点的高度就返回以叶子节点为根节点的树的最大/最小高度,因此终止条件就是遇到空节点时将返回0,然后在上一层+1;想明白这个处理逻辑以后,按照单层递归的逻辑去思考写好代码,其实程序就是会按着一层一层的去遍历。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值