题解 | #判断是不是平衡二叉树#
判断是不是平衡二叉树
http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222
C语言判断平衡二叉树
- 思路:明显的递归问题,平衡二叉树左右子树的差值不大于1,因此应该递归所有的节点,判断节点的左右子树深度差值
- 重点:重点是递归函数的返回值,返回节点的最大深度,同时判断左右子树哪个最深,返回最深的值
- 递归出口:叶子节点作为出口,出口可以设置为两个,一个是叶子节点(针对的是没有左右孩子的节点),另一个是空节点(针对的是父节点只有一个孩子的节点)。当然也可以只给一个空节点的出口函数但是要多递归一层。
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
/**
*
* @param pRoot TreeNode类
* @return bool布尔型
*/
//静态变量flag 标志是否平衡二叉树
static int flag=0;
//二叉树深度判断函数
int judge_AVL(struct TreeNode* pRoot){
//递归两个出口
if(pRoot==NULL)
return 0;
if(pRoot->left==NULL && pRoot->right==NULL)
return 1;
//左孩子的深度
int ldepth=judge_AVL(pRoot->left);
//右孩子的深度
int rdepth=judge_AVL(pRoot->right);
//判断左右孩子深度差值大于1,非平衡二叉树,flag设置1
if(abs(ldepth-rdepth)>1){
flag=1;
return 0;
}
//返回左右孩子最深的深度
if(ldepth>rdepth)
return ldepth+1;
else
return rdepth+1;
}
bool IsBalanced_Solution(struct TreeNode* pRoot ) {
if(pRoot==NULL)
return true;
judge_AVL(pRoot);
if(flag==0)
return true;
else
return false;
}