码迷,mamicode.com
首页 > 其他好文 > 详细

【3】输入一颗二叉树判断是不是平衡二叉树

时间:2014-05-26 04:34:53      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:style   class   blog   c   code   a   

题目:输入一颗二叉树的根结点,判断该二叉树是不是平衡二叉树。平衡二叉树是满足所有结点的左右子树的高度差不超过1的二叉树


方案一:遍历数组的每一个结点,对每一个结点求它的左右子树的高度并进行判断。时间复杂度大于O(n),小于O(n^2)效率较低,因为有很多点需要重复访问。

//二叉树的结点
struct BinaryTreeNode{
     int m_value;
     BinaryTreeNode *m_lson;
     BinaryTreeNode *m_rson;
};

//求二叉树的深度
int GetDepth(BinaryTreeNode *root){
	if(root == NULL){
	   return 0;
	}
	int lsonDepth = GetDepth(root->m_lson);
	int rsonDepth = GetDepth(root->m_rson);
	return lsonDepth < rsonDepth ? (rsonDepth+1) : (lsonDepth+1);
}

//方案一对每个结点进行判断
bool IsBalanced(BinaryTreeNode *root){
	if(root == NULL){
	    return true;
	}
	int lsonDepth = GetDepth(root->m_lson);
	int rsonDepth = GetDepth(root->m_rson);
	int dis = lsonDepth-rsonDepth;
	if((dis <= 1) && (dis >= -1)){
		return IsBalanced(root->m_lson) && IsBalanced(root->m_rson);
	}
	else{
	    return false;
	}
} 


方案二:利用二叉树的后序遍历,对于先访问左右子树,然后对每个根结点进行判断,传入一个高度的参数即可。时间复杂度为O(n)。

//二叉树的结点
struct BinaryTreeNode{
     int m_value;
     BinaryTreeNode *m_lson;
     BinaryTreeNode *m_rson;
};

//后序遍历判断是不是平衡二叉树
bool IsBalanced(BinaryTreeNode *root, int *depth){
	if(root == NULL){
	    *depth = 0;
	    return true;
	}
	int lsonDepth = 0;
	int rsonDepth = 0;
	if(IsBalanced(root->m_lson, &lsonDepth) 
		&& IsBalanced(root->m_rson, &rsonDepth)){
	    int dis = lsonDepth-rsonDepth;
		if((dis >= -1) && (dis <= 1)){
		    *depth = 1+(lsonDepth < rsonDepth ? rsonDepth : lsonDepth);
		    return true;
		}
		else{
		    return false;
		}
	}
	else{
	    return false;
	}
}



【3】输入一颗二叉树判断是不是平衡二叉树,布布扣,bubuko.com

【3】输入一颗二叉树判断是不是平衡二叉树

标签:style   class   blog   c   code   a   

原文地址:http://blog.csdn.net/chenguolinblog/article/details/26745737

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!