平衡二叉树的性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
//定义二叉树结构
struct BinaryTree
{
int data;
BinaryTree *left;
BinaryTree *right;
};
//获取二叉树的深度,递归求解
int treeDepth(BinaryTree *btree)
{
if(btree == NULL)
return 0;
else
{
int leftSubTreeDepth = treeDepth(btree->left);
int rightSubTreeDepth = treeDepth(btree->right);
return 1 + (leftSubTreeDepth > rightSubTreeDepth ? leftSubTreeDepth : rightSubTreeDepth);
}
}
//如果二叉树任意节点的左子树高度和右子树高度相差不大於一,就是平衡二叉树
bool isBalancedTree(BinaryTree *pRoot)
{
if(pRoot == NULL)
return true;
int leftSubTreeDepth = treeDepth(pRoot->left); //根节点左子树高度
int rightSubTreeDepth = treeDepth(pRoot->right);//根节点右子树高度
int diff = leftSubTreeDepth - rightSubTreeDepth;
if(diff>1 || diff<-1)
return false;
else return isBalancedTree(pRoot->left) && isBalancedTree(pRoot->right);
}
其实上面的方法很简单,但是重复计算。如果我们用后序遍历的方式遍历二叉树的每一个结点,在遍历到一个结点之前我们已经遍历了它的左右子树。只要在遍历每个结点的时候记录它的深度(某一结点的深度等于它到叶节点的路径的长度),我们就可以一边遍历一边判断每个结点是不是平衡的。下面是这种思路的参考代码:
bool isBalancd(BinaryTree *pRoot, int *dept)
{
if(pRoot==NULL)
{
*dept = 0;
return true;
}
int leftDept, rightDept;
if(isBalancd(pRoot->left, &leftDept) && isBalancd(pRoot->right, &rightDept))
{
*dept = 1 + (leftDept > rightDept ? leftDept : rightDept);
return true;
}
return false;
}
//给上面的函数传递一个根节点和定义一个深度初始值
bool isBalancd(BinaryTree *pRoot)
{
int depth = 0;
return isBalancd(pRoot, &dept);
}