题目:输入一棵二叉树,判断该二叉树是否是平衡二叉树。
思路:后续遍历二叉树,同时得到子树的深度,判断子树的深度是否满足平衡条件即可
思路2:借助深度函数,同时判断左右子树是否平衡,并且深度差小于等于1,在某些情况会比1快
public class Solution {
//后续遍历时,遍历到一个节点,其左右子树已经遍历 依次自底向上判断,每个节点只需要遍历一次
private boolean isBalanced=true;
public boolean IsBalanced_Solution(TreeNode root) {
getDepth(root);
return isBalanced;
}
public int getDepth(TreeNode root){
if(root==null)
return 0;
int left=getDepth(root.left);
int right=getDepth(root.right);
if(Math.abs(left-right)>1){
isBalanced=false;
}
return right>left ?right+1:left+1;
}
}
C++版
class Solution {
public:
bool isBalanced=true;
bool IsBalanced_Solution(TreeNode* pRoot) {
if(!pRoot) return true;
deep(pRoot);
return isBalanced;
}
int deep(TreeNode* pRoot){
if(!pRoot) return 0;
int left=deep(pRoot->left);
int right=deep(pRoot->right);
if(abs(left-right)>1)isBalanced=false;
return max(left,right)+1;
}
};
思路2
class Solution {
public:
bool IsBalanced_Solution(TreeNode* pRoot) {
if(!pRoot) return true;
return IsBalanced_Solution(pRoot->left) && IsBalanced_Solution(pRoot->right) && abs(deep(pRoot->left)-deep(pRoot->right))<=1;
}
int deep(TreeNode* pRoot){
if(!pRoot) return 0;
return max(deep(pRoot->left),deep(pRoot->right))+1;
}
};