平衡二叉树(递归)

https://leetcode.cn/problems/balanced-binary-tree/

本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

简单理解就是,要求二叉树某个节点的两个子节点高度差不能超过1,如果把某节点看作根节点的话,即次节点为根节点的二叉树的高度差不能超过1。

这里强调一波概念:

  • 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。

  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。

这个时候我们发现和之前的深度计算有所区别,之前使用层序遍历解决深度问题的时候,我们都是从根节点出发逐渐增加depth的值,但是这道题的根节点是不断改变的,也就是我们遍历的每一个节点都会看做根节点,然后判断他的子节点(如果有)差距是否大于1,所以无法应用层序遍历进行,需要考虑递归或迭代。

如果考虑递归迭代 ,我们发现后序遍历是我们所需要的,因为我们要求某节点的高度,都是从叶子节点入手,最后考虑中间节点,故采用后序遍历的”左右中“是我们所需的。

确定了遍历思路后,我们开始确定递归的三要素,

  1. 参数返回值:

我们的参数是node节点,返回的是该节点作为根节点的时候,子节点的高度。

  1. 终止条件:

和以往一样,当遍历到空的时候结束。

  1. 单层递归逻辑:

首先明确左右中的顺序,先处理左节点(得到左节点对应的高度)再处理右节点。最后计算左右节点高度差。分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。

 int leftHeight = getHeight(node -> left);
    if(leftHeight == -1) return -1;
    int rightHeight = getHeight(node -> right);
    if(rightHeight == -1) return -1;
    return abs(leftHeight - rightHeight)> 1?-1:1 + max(leftHeight, rightHeight);

class Solution {
public:
    bool isBalanced(TreeNode* root) {
        return getHeight(root) == -1 ? false : true;

    }
    int getHeight(TreeNode* node){
    if (node == nullptr) {
            return 0;
        }
    int leftHeight = getHeight(node -> left);
    if(leftHeight == -1) return -1;
    int rightHeight = getHeight(node -> right);
    if(rightHeight == -1) return -1;
    return abs(leftHeight - rightHeight)> 1?-1:1 + max(leftHeight, rightHeight);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值