您的位置:首页 > 其它

二叉树的深度以及判断二叉树是否为平衡二叉树

2017-08-10 16:53 375 查看

二叉树的深度

题目:

输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

基本思想:

我们假定Tree的节点个数为GetTreeNodeNum(),其左子树为LeftTree,右子树为RightTree。那么求Tree的深度有以下几种情况:

GetTreeNodeNum()==1&&LeftTree==NULL&&RightTree==NULL 则Tree的深度depth=1.

GetTreeNodeNum()>1&&LeftTree!=NULL&&RightTree==NULL 则Tree的深度depth=GetDepth(LeftTree)+1.

GetTreeNodeNum()>1&&LeftTree==NULL&&RightTree!=NULL 则Tree的深度depth=GetDepth(RightTree)+1.

GetTreeNodeNum()>1&&LeftTree!=NULL&&RightTree!=NULL 则Tree的深度depth= Max(GetDepth(RightTree),GetDepth(LeftTree))+1.

综上,代码如下:

//递归版本
int TreeDepth(TreeNode* pRoot)
{

if(pRoot==NULL) return 0;

int nLeft=TreeDepth(pRoot->left);
int nRight=TreeDepth(pRoot->right);

return (nLeft>nRight)?nLeft+1:nRight+1;
}
//非递归版本
int TreeDepth(TreeNode* pRoot)
{

if(pRoot==NULL) return 0;
queue<TreeNode *> q;
q.push(pRoot);
int depth=0;
while(!q.empty()){
int len=q.size();
depth++;
while(len--){
TreeNode *tmp=q.front();
q.pop();
if(tmp->left) q.push(tmp->left);
if(tmp->right) q.push(tmp->right);
}
}
return depth;
}


树是否为平衡二叉树

题目:

输入一棵二叉树,判断该二叉树是否是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一颗平衡二叉树。

解法1:

有了求二叉树的深度的代码之后,我们知道求解一个树是否为平衡二叉树,其实就是在遍历每一个节点的时候,判断其左右子树的深度的差值是否超过1,如果每个节点都满足平衡的条件,则返回true。代码如下:

bool isBalanced(TreeNode *pRoot){
if(pRoot==NULL)
return true;
int left=TreeDepth(pRoot->left);
int right=TreeDepth(pRoot->right);
int dif=left-right;
if(dif>1||dif<-1)
return false;
return isBalanced(pRoot->left)&&isBalanced(pRoot->right);
}


解法2

解法1存在着重复遍历节点多次的缺陷。例如在判断根节点是否是平衡的时候,会依次遍历左右子树一遍。如果平衡,继续遍历根节点左右子树的时候,又会重复遍历在判断根节点平衡时遍历过的节点。故我们可以改用后序遍历的方式来遍历二叉树的每一个节点,这样在遍历一个节点的时候,我们已经遍历了其左右子树,那么我们可以在遍历左右子树的时候记录其结点的深度,那么我们可以一边遍历一边判断每个节点是否是平衡的。

代码如下:

bool IsBalanced_Solution(TreeNode* pRoot) {

int depth=0;
return IsBanlanced(pRoot,&depth);

}
bool IsBanlanced(TreeNode* pRoot, int* pDepth)
{
if(pRoot==NULL)
{
*pDepth=0;
return true;
}

int left,right;

if(IsBanlanced(pRoot->left,&left)&&IsBanlanced(pRoot->right,&right))
{
int diff=left-right;
if(diff<=1&&diff>=-1)
{
*pDepth=1+(left>right?left:right);
return true;
}
}
return false;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二叉树