一、概念
平衡二叉树或者是棵空树,或者是具体下列性质的二叉查找树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的高度只差的绝对值不超过1。若将二叉树结点的平衡因子定义为该节点的左子树的高度减去它的右子树的高度,则所有结点的平衡因子只可能为-1,0,1。只要有一个结点的平衡因子的绝对值大于1,那么这棵树就失去了平衡。
简单例子
- 下图为平衡二叉树
- 下图为非平衡二叉树
平衡二叉树存储结构的类型定义如下:
typedef int KeyType; // 关键字类型为整数类型
typedef struct {
KeyType key; // 关键字项
} RecordType, RcdType; // 记录类型
typedef struct BBSTNode {
RcdType data;
int bf; // 结点平衡因子
struct BBSTNode *lchild, *rchild; // 左右孩子
} * BBSTree; // 平衡二叉树
二、四种遍历方式
首先是输出平衡二叉树关键字函数
void visit(KeyType key) {
printf("%d ", key);
}
- 前序遍历(根-左-右)
定义:规则是若二叉树为空,则空操作返回, 否则先访问根结点,然后前序遍历左子树,再遍历右子树。
void PreOrderTraverse(BBSTree T, void( *visit)(KeyType)) {
if (NULL == T) {
return;
}
visit(T->data.key);
PreOrderTraverse(T->lchild, visit);
PreOrderTraverse(T->rchild, visit);
}
- 中序遍历(左-根-右)
定义:规则是树若为空,操作返回,否则从根结点开始,中序遍历(注意并不是访问根结点)根结点的左子树,然后访问根结点,最后中序遍历右子树。
void InOrderTraverse(BBSTree T, void( *visit)(KeyType)) {
if (NULL == T) {
return;
}
InOrderTraverse(T->lchild, visit);
visit(T->data.key);
InOrderTraverse(T->rchild, visit);
}
- 后序遍历(左-右-根)
定义:规则是若树空,操作返回,否则是从左到右先叶子后结点的方式遍历访问左右子树,最后是访问根结点。
void PostOrderTraverse(BBSTree T, void( *visit)(KeyType)) {
if (NULL == T) {
return;
}
PostOrderTraverse(T->lchild, visit);
PostOrderTraverse(T->rchild, visit);
visit(T->data.key);
}
- 层序遍历
定义:规则是若树空,操作返回,否则是从树的第一层,也就是从根结点开始访问,从上而下逐层遍历,在同一层中,从左到右的顺序对结点逐个访问。
Status LevelOrderTraverse(BBSTree T, void( *visit)(KeyType), int level) {
if (!T || level < 0) {
return ERROR;
}
if (level == 0) {
visit(T->data.key);
return OK;
}
return LevelOrderTraverse(T->lchild, visit, level - 1) +
LevelOrderTraverse(T->rchild, visit, level - 1);
}
按层打印功能函数
void PrintNodeByLevel(BBSTree T) {
if (NULL == T) {
return;
}
int level;
for (level = 0; ; level++) {
if (!LevelOrderTraverse(T, visit, level)) {
break;
}
}
}
层序遍历也可以使用队列
- 采用队列方法
void LevelOrderTraverse(BBSTree T){
Queue Q = CreateQueue();
if(T != NULL){
EnQueue(T,Q);
}
while(!IsEmpty(Q)){
visit(DeQueue(Q));
if(T->lchild)
EnQueue(T->lchild,Q);
if(T->rchild)
EnQueue(T->rchild,Q);
}
}
简单例子
A
/ \
B C
/ \ / \
D E F G
层序遍历结果是: ABCDEFG
前序遍历结果是: ABDECFG
中序遍历结果是: DBEAFCG
后序遍历结果是: DEBFGCA