题目描述:
给定一个二叉树,判断它是否是 平衡二叉树
示例 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
解题思路
作者:我自横刀向天笑
链接:https://leetcode.cn/problems/balanced-binary-tree/solutions/1248802/ping-heng-er-cha-shu-cyu-yan-xiang-jie-2-8m36/
来源:力扣(LeetCode)
一、自顶而下进行判断
时间复杂度:O(n)
空间复杂度: O(1)
1.关键点:
1:自顶而下,判断每一个结点是否是平衡的
2:分别获取每个结点的左右子树的深度,根据左右子树深度差判断是否平衡。
3:遍历全部结点,对所有结点的平衡性进行判断
4:getTreeDepth函数多次调用,每个结点,都需要调用2次以获取左右子树深度
2.题解代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
//递归获取深度
int getTreeDepth(struct TreeNode* node)
{
int rightDepth = 1;
int leftDepth = 1;
if(node == NULL)
return 0;
//查找左子树
if(node->left != NULL)
leftDepth = rightDepth + getTreeDepth(node->left); //实现了递归的计数增加
//查找右子树
if(node->right != NULL)
rightDepth = rightDepth + getTreeDepth(node->right) ;
return leftDepth > rightDepth ? leftDepth : rightDepth; //返回最大深度
}
bool isBalanced(struct TreeNode* root)
{
if(root == NULL || (root->left == NULL && root->right == NULL)) //当前节点不存在 或 当前结点是叶子结点
return true;
//对当前根节点进行平衡性检验:若当前根节点的左右子树深度差大于1
if(abs (getTreeDepth(root->left) - getTreeDepth(root->right)) > 1)
return false;
//分别对当前结点的左右孩子的平衡性进行检验,只有都为true时才为true
return isBalanced(root->left) && isBalanced(root->right) ;
}
二、自底而上进行判断:
时间复杂度:O(n)
空间复杂度: O(1)
1.关键点:
1:自自底而上,判断每一个结点是否是平衡的
2:相对于自顶而下,减少了遍历的次数。
3:因为到达左子树底部后,每次对应的左子树都是放在递归调度中的
4:每次只需要获取新的右子树长度便可
2.题解代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int getTreeDepth(struct TreeNode* node)
{
if (node == NULL)
return 0;
//这里是递归调用,因此能实现自底向上的结点平衡性判断
int rightTreeDepth = getTreeDepth(node->left); //获取左子树高度
int leftTreeDepth = getTreeDepth(node->right); //获取右子树高度
//abs函数用于得到绝对值
//若当前结点不平衡
if (rightTreeDepth == -1 || leftTreeDepth == -1 || (abs(leftTreeDepth - rightTreeDepth) > 1) )
return -1; //若左右子树深度为-1或左右子树深度差大于1
//若当前结点平衡
else
return leftTreeDepth >= rightTreeDepth ? leftTreeDepth + 1 : rightTreeDepth + 1 ;
//取左右子树中深度较大值, 使其+1, 通过返回函数作为当前结点的深度
}
bool isBalanced(struct TreeNode* root)
{
//bool类型中-1表示false,0表示true,因此这里用返回值来判断
return getTreeDepth(root) >= 0;
}