平衡二叉树(AVL树)是满足下面条件的二叉树:
1、是一棵空树。
2、它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
树的高度:也就等于树的层数(根节点位于第一层)。
计算二叉树的高度:用到了递归结构,树的高度是,其左子树和右子树较高的子树的高度加1,递归的终止条件是子树的根节点为空。
int deep(BiTree T)
{
if (T == NULL) return 0;
int leftdeep = deep(T->lchild);
int rightdeep = deep(T->rchild);
return leftdeep > rightdeep ? leftdeep+1 : rightdeep+1;
}
判断是否为平衡二叉树:
bool isBalanceTree(BiTree root)
{
if (root == NULL) return true;
int leftdeep = deep(root->lchild); //计算左子树高度
int rightdeep = deep(root->rchild); //计算右子树高度
int absdeep = leftdeep > rightdeep ? (leftdeep - rightdeep) : (rightdeep - leftdeep);
return (absdeep <= 1 && isBalanceTree(root->lchild) && isBalanceTree(root->rchild)); // 判断左右子树高度差是否不超过1,且左右子树是否是平衡二叉树
}
整体测试程序(利用前序遍历的方式,创建二叉树,具体见http://blog.csdn.net/bxw1992/article/details/74936906):
#include<iostream>
using namespace std;
typedef struct btnode
{
char data;
struct btnode *lchild;
struct btnode *rchild;
}btnode, *BiTree;
/*
输入序列:
AB#D##C## 平衡二叉树
AB#D#E##C## 非平衡二叉树
*/
void frontCreat(BiTree *T)
{
char temp;
cin >> temp;
if (temp == '#')
{
*T = NULL;
}
else
{
*T = (btnode*)malloc(sizeof(btnode));
(*T)->data = temp;
frontCreat(&((*T)->lchild));
frontCreat(&((*T)->rchild));
}
}
void frontPrint(BiTree T)
{
if (T == NULL) return;
cout << T->data << " ";
frontPrint(T->lchild);
frontPrint(T->rchild);
}
int deep(BiTree T)
{
if (T == NULL) return 0;
int leftdeep = deep(T->lchild);
int rightdeep = deep(T->rchild);
return leftdeep > rightdeep ? leftdeep+1 : rightdeep+1;
}
bool isBalanceTree(BiTree root)
{
if (root == NULL) return true;
int leftdeep = deep(root->lchild);
int rightdeep = deep(root->rchild);
int absdeep = leftdeep > rightdeep ? (leftdeep - rightdeep) : (rightdeep - leftdeep);
return (absdeep <= 1 && isBalanceTree(root->lchild) && isBalanceTree(root->rchild));
}
int main()
{
BiTree T;
frontCreat(&T);
cout << "前序遍历" << endl;
frontPrint(T);
cout << endl;
cout << deep(T) << endl;
cout << isBalanceTree(T);
system("pause");
return 0;
}