1.二叉树的遍历:
先序遍历: 根 左 右
中序遍历: 左 根 右
后序遍历: 左 右 根
对根的遍历都是从上到下,从左到右
1.先对树的根进行排序。
2.再对树根的左结点(可以看作一个根)进行排序,
并把这一轮排进来的东西插入到这个根的左右。
3.再对2中的下一个根进行排序,方法与2中一样。
排序总是后面的插入前面的顺序中,优先级高些
2.根据用户的输入创建一个二叉排序树
#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct root
{
Elemtype data;
struct root *lchild,*rchild;
}Root;
/*****************************
根据用户的输入创建一个二叉排序树
方法1.找到后直接插入
******************************/
Root *creat()
{
Root *r=NULL;
// Root *r=(Root *)malloc(sizeof(*r)); //错误!!
//空间一分配下来就会自动给他赋 ‘0’ !!!!!!
//这里我需要的只是一个指针(游标),不用分配空间!!!!!
Root *r1=r;
// Elemtype i;
while(1)
{
Elemtype i;
scanf("%d",&i);
if(i==100)
{
break;
}
Root *rnew=(Root *)malloc(sizeof(*r));
rnew->data=i;
rnew->rchild=NULL;
rnew->lchild=NULL;
/* if(r==NULL)
{ //导致段错误!树的头一直为空,移动的只是一个游标(树头的副本)!!
printf("ddd\n");
r=rnew;
} */
if(r1==NULL)
{
r1=rnew;
}
else
{
r=r1; //让查找始终从树的根开始进行;
while(1)
{
if(rnew->data > r->data) //1.若插入的数比树根大
{
if(r->rchild == NULL) //若要插入的地方为空(不能覆盖原有的数据)
{
r->rchild=rnew; //插入
break; //跳出while循环,必须要人为的用break跳出!!!!
}
r=r->rchild;
}
else //若插入的数不比树根大
{
if(r->lchild == NULL) //若要插入的地方为空(不能覆盖原有的数据)
{
r->lchild=rnew; //插入
break; //跳出while循环,必须要人为的用break跳出!!!!
}
r=r->lchild;
}
}
}
}
return r1; //返回数的根
//注意!!!这里不能用游标 r ,
//因为r已经指向最后一个插入的数据!!!!!!这样仅仅只能返回一个结点而已
}
/****************************
根据用户的输入创建一个二叉排序树
方法2.先找到再插入
*****************************/
/*
Root *creat()
{
Root *r=NULL;
// Root *r=(Root *)malloc(sizeof(*r)); //错误!!
//空间一分配下来就会自动给他赋 ‘0’ !!!!!!
//这里我需要的只是一个指针(游标),不用分配空间!!!!!
Root *r1=r;
while(1)
{
Elemtype i;
scanf("%d",&i);
if(i==100)
{
break;
}
Root *rnew=(Root *)malloc(sizeof(*r));
rnew->data=i;
rnew->rchild=NULL;
rnew->lchild=NULL;
// if(r==NULL)
// {
// r=rnew;
// }
if(r1==NULL)
{
r1=rnew;
else
{
/*step1.1 先找位置*/
/* r=r1; //让查找始终从树的根开始进行;
while(1)
{
if(rnew->data > r->data)//1.若插入的数比树根大
{
if(r->rchild == NULL) //若要插入的地方为空(不能覆盖原有的数据)
{
break; //跳出while循环,必须要人为的用break跳出!!!!
}
r=r->rchild;
/*
r->rchild=rnew;
r=r->rchild; /
break;
*/
/* }
else //若插入的数不比树根大
{
if(r->lchild == NULL) //若要插入的地方为空(不能覆盖原有的数据)
{
break; //跳出while循环,必须要人为的用break跳出!!!!
}
r=r->lchild;
/*
r->lchild=rnew;
r=r->lchild;
break; */
// }
// }
/*step2.2 插入*/
/* if(pnew->data > p->data)
{
p->rchild = pnew;
}
else
{
p->lchild = pnew;
}
}
}
return r1; //返回数的根
//注意!!!这里不能用游标 r ,
//因为r已经指向最后一个插入的数据!!!!!!这样仅仅只能返回一个结点而已
}
*/
/*******************************
先序遍历
*******************************/
void pre_order(Root *r)
{
if(r==NULL)
{
return ;
}
printf(" %d\t",r->data);
pre_order(r->lchild);
pre_order(r->rchild);
}
/*****************************
中序遍历
******************************/
void mid_order(Root *r)
{
if(r==NULL)
{
return ;
}
pre_order(r->lchild);
printf(" %d\t",r->data);
pre_order(r->rchild);
}
/*******************************
后序遍历
*******************************/
void post_order(Root *r)
{
if(r==NULL)
{
return ;
}
pre_order(r->lchild);
pre_order(r->rchild);
printf(" %d\t",r->data);
}
int main()
{
Root *r=creat();
pre_order(r);
printf("\n");
mid_order(r);
printf("\n");
post_order(r);
printf("\n");
return 0;
}