定义:
二叉排序树是一棵特殊的二叉树。其必须满足:要么为空树或者树上任一结点,其值大于等于其左子树上的任意结点值(左子树非空),且小于其右子树上任意结点的值(右子树非空),其左右子树也满足该定义。
结构体:
typedef struct node //二叉树结构体
{
struct node * lchild;
struct node * rchild;
int data;
}Node;
创建二叉排序树:
创建的过程是先进行查找,然后在合适位置将结点插入,所以结点插入完毕则创建成功。
int CreateNode(int s,Node * & p) //创建二叉排序树的结点
{
if (p)
{
if (s<p->data) return CreateNode(s,p->lchild); //目标结点在左子树中
else if (s==p->data)return 0; //已存在该结点,无需插入
else return CreateNode(s,p->rchild); //目标结点在右子树中
}
else //不存在该结点,则插入
{
p = (Node *)malloc(sizeof(Node));
p->data = s;
p->lchild = NULL;
p->rchild = NULL;
return 1;
}
}
int BuildBST(int input[],int length,Node * & T) //建立二叉排序树
{
int node_nume =0; //树中不重复的结点数结点
for (int i = 0; i < length; i++)
node_nume+=CreateNode(input[i],T);
return node_nume;
}
删除二叉排序树:
void DeletTree(Node * p) //删除树
{
if (p)
{
DeletTree(p->lchild);
DeletTree(p->rchild);
free(p);
}
}
二叉树的递归遍历核心代码:
void PreOder(Node * p,int &node_num) //后序遍历
{
if (p)
{
printf("%d",p->data);
PreOder(p->lchild,node_num);
PreOder(p->rchild,node_num);
}
}
void InOder(Node * p,int &node_num) //中序遍历
{
if (p)
{
InOder(p->lchild,node_num);
printf("%d",p->data);
InOder(p->rchild,node_num);
}
}
void PostOder(Node * p,int &node_num) //后序遍历
{
if (p)
{
PostOder(p->lchild,node_num);
PostOder(p->rchild,node_num);
printf("%d",p->data);
}
}
下面是输入n个整数,建立二叉排序树,并输出各项遍历序列的主函数:
int main()
{
int n; //输入序列的长度
int input[100]; //输入序列
int node_num; //树中不重复结点数
Node * Tree =NULL;
while (scanf("%d",&n)!=EOF)
{
for (int i = 0; i < n; i++)
scanf("%d",&input[i]);
n=BuildBST(input,n,Tree); //建立排序树
printf("前序为:");
node_num =n;
PreOder(Tree,node_num); //先序遍历
printf("中序为:");
node_num =n;
InOder(Tree,node_num); //中序遍历
printf("后序为:");
node_num =n;
PostOder(Tree,node_num); //后序遍历
DeletTree(Tree); //删除树
}
return 0;
}
黑框输出运行结果:
后记:
遍历运用很复杂,要多看些应用实例