题目详情
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
示例
给定二叉树 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ping-heng-er-cha-shu-lcof/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
若此树是平衡二叉树,则所有结点都需要满足其左右子树的深度相差不超过1,否则就不是;而结点所在的深度=max(左子树的深度, 右子树的深度)+1;
方法一:先序遍历(自顶向下)
思路: 构造一个函数High(root)
用于获取当前树的深度,再通过调用该函数获取某子树的左右子树的高度,然后进行比较深度差abs(High(root->left) - High(root->right)) <=1
是否成立,判断该子树是不是平衡二叉树,若所有子树都是平衡二叉树,则此树是平衡二叉树。
流程:
High(root)
函数: 递归计算root的深度
- 终止条件: root为空;
- 返回值: 返回左右子树的最大深度+1;
isBalanced(root)
函数: 判断root是不是平衡二叉树
- 特值处理: root为空,返回true;
- 返回值: 所有子树都需要满足平衡二叉树,所以同时满足下面三个条件,用&&连接
1.abs(High(root->left) - High(root->right)) <=1
: 判断当前子树是否是平衡二叉树;
2.isBalanced(root->left)
: 判断当前子树的左子树是否是平衡二叉树;
3.isBalanced(root->right)
: 判断当前子树的右子树是否是平衡二叉树。
主要代码:
bool isBalanced(TreeNode* root) {
if(!root)
return true;
if(abs(High(root->left)-High(root->right)) <= 1
&& isBalanced(root->left) && isBalanced(root->right))
return true;
return false;
}
int High(TreeNode* root)
{
if(!root)
return 0;
return max(High(root -> left), High(root -> right))+1;
}
方法二:后序遍历(自底向上)
思路: 对树进行后序遍历,自底向上返回子树的深度,判断子树是否是平衡二叉树,若不是,则向上返回-1,进行剪枝
流程:
recur(root)
函数: 返回-1或者树的深度
- 终止条件:
root
为空;- 左(右)子树深度为-1,即此树不为平衡二叉树,同时直接返回-1;
- 返回值:
- 当结点
root
的左右子树的深度差<=1,则返回该子树的深度; - 当结点
root
的左右子树的深度差>1,则直接返回-1。
isBalanced(root)
函数: 判断root是不是平衡二叉树
- 返回值:
当recur(root)
!=-1时,表示root是平衡二叉树,则返回true,否则返回false;
主要代码:
bool isBalanced(TreeNode* root) {
if(cur(root) != -1) return true;
return false;
}
int cur(TreeNode* root)
{
if(!root) return 0;
int le = cur(root -> left);
if(le == -1) return -1;
int ri = cur(root -> right);
if(ri == -1) return -1;
if(abs(le - ri) <= 1)
return max(le, ri)+1;
else
return -1;
}