解题笔记(20)——判断二叉树是不是平衡的

         问题描述:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。例如下图中的二叉树就是一棵平衡二叉树:

《解题笔记(20)——判断二叉树是不是平衡的》

         思路:对于树的题目,第一反应就是用递归。对于以某个结点为根的树,只需计算出它的左右子树的深度,如果深度相差小于等于1,则递归判断它的左右子树是不是平衡树;否则肯定不是平衡二叉树。这个问题的关键是要计算树的深度,如果是自顶向下,会有很多重复的计算。计算以1为根的树的深度,会牵涉到以2为根、以3为根的子树。计算以2为根的树的深度,会牵涉到以4为根、以5为根的子树。由于要遍历每个结点,判断以该结点为根的树是不是平衡二叉树。所以计算以1为根的树的深度,与计算以2为根的树的深度,会重复计算以4为根、以5为根的子树的深度。

          消除重复办法,当时是能记录下之前计算过的子树的深度,下次使用就不用重新计算。这就需要自底向上的计算深度。庆幸的是递归解决树的问题,就是自底向上的过程。因为我们在递归求解中,先要得出子树的解,子树的解最终会转换为叶结点的解。可以利用后序遍历的方法,遍历每个结点时,先判断它的左右子树是不是平衡二叉树,同时记录下左右子树的深度,然后判断该结点为根的树是不是平衡二叉树,至于该树的深度计算很方便,取左右子树中较大的深度+1就可以了。这里左右子树的深度在递归求解中已经计算出来,不需要重复计算了。

       参考代码:

struct BinaryTreeNode
{
	int data;
	BinaryTreeNode *pLeft;
	BinaryTreeNode *pRight;
};
//函数功能 : 判断二叉树是不是平衡的
//函数参数 : pRoot为根结点,pDepth为根结点的深度。
//返回值 :   是否平衡的
bool IsBalanced(BinaryTreeNode *pRoot, int *pDepth)
{
	if(pRoot == NULL)
	{
		*pDepth = 0;
		return true;
	}
	int leftDepth, rightDepth; //左右子树的深度
	if(IsBalanced(pRoot->pLeft, &leftDepth)&&
		IsBalanced(pRoot->pRight, &rightDepth))
	{
		int diff = leftDepth - rightDepth;
		if(diff == 0 || diff == 1 || diff == -1)  //相差为0或1或-1
		{
			*pDepth = 1 + (leftDepth > rightDepth ? leftDepth: rightDepth); 
			return true;
		}
		else
			return false;
	}
	return false;
}

            
本人享有博客文章的版权,转载请标明出处 http://blog.csdn.net/wuzhekai1985


    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/wuzhekai1985/article/details/6642844
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞