[互联网面试笔试汇总C/C++-16] 判断一棵二叉树是否是平衡二叉树

首先,看一下平衡二叉树的定义:

平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。


思路:利用递归的思想


代码

int DepthTree(BSTreeNode *pbs)  
{  
    if (pbs==NULL)  
        return 0;  
    else  
    {  
        int leftLength=DepthTree(pbs->left);  
        int rigthLength=DepthTree(pbs->right);  
        return 1+(leftLength>rigthLength ? leftLength:rigthLength);  
    }  
}  
  
bool isBalanceTree(BSTreeNode *pbs)  
{  
    if (pbs==NULL)  
    {  
        return true;  
    }  
      
    int depthLeft=DepthTree(pbs->left);  
    int depthRight=DepthTree(pbs->right);  
      
    if (abs(depthLeft-depthRight)>1)   
         return false;  
    else  
        return isBalanceTree(pbs->left) && isBalanceTree(pbs->right);  
}  


改进:这样实际上是有很多重复计算的,如果想进一步提高效率的话则需要考虑如何每个结点只遍历一次。

其实就是一边遍历一遍进行判断。

代码:

bool isBalanceTree(Node* pRoot, int * pDepth)
{
	if(pRoot==NULL)
	{
		*pDepth = 0;
		return true;
	}
	int right,left;
	if(isBalanceTree(pRoot->left,&left)&&isBalanceTree(pRoot->right,&right))
	{
		if(left-right < 1 && right-left < 1)
		{
			pDepth = 1 + (left>right)?left:right;
			return true;
		}
	}
return false;
}

方法一和方法二,一个是从上往下进行判断,一个是从下往上进行判断,一个有很多重复,一个没有重复,读者可以自己体会。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值