整理自剑指Offer
一:题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
二:解题思路
如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
每个结点只遍历一次的解法:
用后续遍历的方式遍历二叉树的每一个节点,在遍历到一个结点之前我们已经比遍历它的左右子树。只要在遍历每个结点的时候记录它的深度(某结点的深度等于它到叶子结点的路径长度),这样就可以一边遍历一边判断每个节点是不是平衡的。
即在遍历某个节点的左右子结点之后,我们可以根据它左右子结点的深度判断它是不是平衡的,并且获得当前节点的深度。
三:代码实现
class Solution {
public:
bool IsBalanced(TreeNode* pRoot,int& depth){
//如果当前结点是空结点,则它的深度为0,以它为根节点的二叉树是平衡二叉树,返回true
if(pRoot==NULL){
depth=0;
return true;
}
//如果当前节点不为空
int left,right; //记录左右子树的深度
//判断其左右子树是否为平衡二叉树
//如果左右子树均为平衡二叉树,记录左右子树的深度,判断当前节点是否满足平衡二叉树条件
if(IsBalanced(pRoot->left,left) && IsBalanced(pRoot->right,right)){
int diff=left-right;
if(diff<=1 && diff>=-1){
depth=1+(left>right?left:right);
return true;
}
}
//当前节点不满足平衡二叉树的条件
return false;
}
bool IsBalanced_Solution(TreeNode* pRoot) {
if(pRoot==NULL)
return true;
int depth=0;
return IsBalanced(pRoot,depth);
}
};
用一个例子来说明一下递归的过程