前言
本文包含二叉树、二叉查找树、Av树等的定义和相关操作,由于部分记录在印象笔记中,给出了文章链接。
一.树的遍历
遍历树形目录,先序遍历和后序遍历分别实现打印目录结构和统计目录下文件个数。先根遍历、后根遍历
二.BST定义及其基本操作
二.AvTree定义及其基本操作
1.简介
AvTree是BST的一种,但是其每个节点的左子树和右子树的高度最多差1。
BST:对于其每一个节点X,其左子树所有节点关键字值小于x关键字值,右子树反之。
相对于BST,AvTree的节点多了Height值。所谓树的高度即根的高:根到任意一个树叶的最长路径长,其节点声明如下:
struct AvlNode;
typedef struct AvlNode *Position;
typedef struct AvlNode *AvlTree;
struct AvlNode{
int ele;
int height;
AvlTree Left;
AvlTree Right;
}
2.基本操作
1)左单旋和右单旋是对称操作,左单旋针对height(left)-height(right)==2
的部分情况,代码如下;
Position SingleRotateWithLeft(Position k2){
Position K1;
K1=K2->Left;
K2->Left=K1->Right;
K1->Right=K2;
K2->height=Max(Height(K2->Left),Height(K2->Right)+1);
K1->height=Max(Height(K1->Left),Height(K1->Right)+1);
}
大致分为三步:
1. 临时节点赋值;
2. 使用临时节点旋转;
3. 更新临时节点和旋转接点的高度值;
2)某个节点的左双旋转即,首先将此节点左节点进行右单旋转,然后将此节点进行左单旋转。代码如下:
Position DoubleRotateWithLeft(Position K3){
K3->Left=SingleRotateWithRight(k3->Left);
return SingleRotateWithLeft(K3);
}
3)完整示例如下:
#include <stdio.h>
#include <stdlib.h>
struct AvlNode;
typedef struct AvlNode *Position;
typedef struct AvlNode *AvlTree;
AvlTree Insert(int x,AvlTree T);
Position SingleRotateWithLeft(Position K2);
Position SingleRotateWithRight(Position K2);
Position DoubleRotateWithLeft(Position K3);
Position DoubleRotateWithRight(Position K3);
//AvlTree Delete(int x,AvlTree T);
void printTree(AvlTree T);
int Height(AvlTree t);
int Max(int a,int b);
struct AvlNode{
int ele;
int height;
AvlTree Left;
AvlTree Right;
};
int main()
{
AvlTree t=NULL;
int i=0;
int a[10]={1,2,3,4,5,6,7,8,9,10};
for(i=0;i<10;i++){
t=Insert(a[i],t);
printTree(t);
printf("==========\n");
}
return 0;
}
int Height(AvlTree t){
if(t==NULL)
return -1;
return t->height;
}
Position SingleRotateWithLeft(Position K2){
Position K1;
K1=K2->Left;
K2->Left=K1->Right;
K1->Right=K2;
K2->height=Max(Height(K2->Left),Height(K2->Right))+1;
K1->height=Max(Height(K1->Left),Height(K1->Right))+1;
return K1;
}
Position SingleRotateWithRight(Position K2){
Position K1;
K1=K2->Right;
K2->Right=K1->Left;
K1->Left=K2;
K2->height=Max(Height(K2->Left),Height(K2->Right))+1;
K1->height=Max(Height(K1->Left),Height(K1->Right))+1;
return K1;
}
Position DoubleRotateWithLeft(Position K3){
K3->Left=SingleRotateWithRight(K3->Left);
return SingleRotateWithLeft(K3);
}
Position DoubleRotateWithRight(Position K3){
K3->Right=SingleRotateWithLeft(K3->Right);
return SingleRotateWithRight(K3);
}
//打印
void printTree(AvlTree t){
int i;
if(t==NULL) return;
for(i=0;i<t->height;i++){
printf("x");
}
printf("%d\n",t->ele);
printTree(t->Left);
printTree(t->Right);
}
AvlTree Insert(int x,AvlTree t){
if(t==NULL){
t=malloc(sizeof(struct AvlNode));
t->ele=x;
t->height=0;
t->Left=t->Right=NULL;
}
else if(x<t->ele){
t->Left=Insert(x,t->Left);
if((Height(t->Left)-Height(t->Right))==2){
if(x<t->Left->ele)
t=SingleRotateWithLeft(t);
else
t=DoubleRotateWithLeft(t);
}
}
else if(x>t->ele){
t->Right=Insert(x,t->Right);
if((Height(t->Right)-Height(t->Left))==2){
if(x>t->Right->ele)
t=SingleRotateWithRight(t);
else
t=DoubleRotateWithRight(t);
}
}
t->height=Max(Height(t->Left),Height(t->Right))+1;
return t;
}
int Max(int a,int b){
if(a>b)
return a;
return b;
}