输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]
返回 true 。
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]
返回 false 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ping-heng-er-cha-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
1、首先了解怎么样才算平衡二叉树,如何判断二叉树是否平衡。如果根节点的左右子树深度差大于1,那么就可以判断不是平衡二叉树,反之则是平衡二叉树。
2、考虑到二叉树的特性,采用递归的方式遍历整个二叉树的所有节点,并且在遍历过程中记录当前节点的深度。若当前节点左右子树都为空,则将深度记作-1,反之将深度记为深度较大者+1
3、每个节点遍历完后,返回给上一级节点当前节点的深度值,如果左右子树深度差大于1就返回-1,表示已经很大可能不是平衡二叉树了(极少数特殊情况除外),否则返回当前节点的深度
4、整个二叉树遍历完后,通过判断返回的值是-1还是二叉树的深度,来判断二叉树是否平衡二叉树
class Solution {
public:
bool isBalanced(TreeNode* root) {
return dfs(root)!=-1;
}
int dfs(TreeNode* node)
{
if(node!=NULL)
{
int left_depth=dfs(node->left);
if(left_depth==-1)
{
return -1;
}
int right_depth=dfs(node->right);
if(right_depth==-1)
{
return -1;
}
return abs(left_depth - right_depth) >1 ? -1 : max(left_depth,right_depth)+1;
}
else
{
return 0;
}
}
};