LeetCode 0110.平衡二叉树 - 自底向上

Posted Tisfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 0110.平衡二叉树 - 自底向上相关的知识,希望对你有一定的参考价值。

【LetMeFly】110.平衡二叉树 - 自底向上

力扣题目链接:https://leetcode.cn/problems/balanced-binary-tree/

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:true

示例 2:

输入:root = [1,2,2,3,3,null,null,4,4]
输出:false

示例 3:

输入:root = []
输出:true

提示:

  • 树中的节点数在范围 [0, 5000]
  • -104 <= Node.val <= 104

方法一:110.平衡二叉树 - 自底向上

判断一棵树是否为平衡二叉树,只需要判断左子树的和右子树的高度之差的绝对值是否 ≤ 1

我们只需要求出每个节点为根的树的高度( max ⁡ ( 左 子 树 , 右 子 树 ) + 1 \\max(左子树, 右子树) + 1 max(,)+1),并且在求高度的过程中,判断左右子树的高度差是否大于1即可(若大于1,则记录下来)。

bool ok = true;

int getHeight(TreeNode* root) 
	if (!root)  // 空节点高度为0
		return 0;
	int left = getHeight(root->left);  // 左子树的高度
	int right = getHeight(root->right);  // 右子树的高度
	if (abs(left - right) > 1)   // 高度差大于1
		ok = false;  // 则不是平衡二叉树
	
	return max(left, right) + 1;  // 以root为根的树的高度是max(left, right) + 1

因为递归过程中,其实是先求的叶节点的高度,因此美其名曰自底向上

  • 时间复杂度 O ( n ) O(n) O(n),其中 n n n是二叉树节点的个数(每个节点只需要遍历一次)
  • 空间复杂度 O ( n ) O(n) O(n),空间复杂度的消耗主要来自递归

AC代码

C++

class Solution 
private:
    bool ok = true;

    int getHeight(TreeNode* root) 
        if (!root)
            return 0;
        int left = getHeight(root->left);
        int right = getHeight(root->right);
        if (abs(left - right) > 1) 
            ok = false;
        
        return max(left, right) + 1;
    
public:
    bool isBalanced(TreeNode* root) 
        getHeight(root);
        return ok;
    
;

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/125691684

以上是关于LeetCode 0110.平衡二叉树 - 自底向上的主要内容,如果未能解决你的问题,请参考以下文章

平衡二叉树的判断

⭐算法入门⭐《二叉树 - 平衡二叉树》简单01 —— LeetCode 110. 平衡二叉树

Leetcode:110. 平衡二叉树

LeetCode110. 平衡二叉树

[LeetCode] 110. 平衡二叉树

LeetCode 110. 平衡二叉树