二叉树的性质:
性质 1 在二叉树的第i层上至多有2^(i-1)个结点(i>=1)。
性质 2 深度为k的二叉树至多有2^k-1个结点,(k>=1)。
性质 3 任何一颗二叉树,终端结点为n0,度为2的结点为n2,那么n0=n2+1。
性质 4 具有n个结点的完全二叉树的深度为└㏒2 n┘+1。
性质 5 完全二叉树按层次从上到下从左到右依次编号。编号为n的节点的左孩子为2n。
二叉树的储存结构:
lchild | data | rchild |
/*---------二叉树的二叉链表储存表示----------*/
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode ,*BiTree;
非递归遍历需要栈:栈的实现过程:栈的线性储存结构与链式储存结构的实现(C语言)。
栈部分的内容:
typedef BiTree pElemType;
typedef struct Snode //栈的储存结构
{
pElemType data; //数据域
struct Snode *next; //指针域
}Snode,*LinkStack;
void Init_StackL(LinkStack *S) //初始化院栈
{
*S=NULL;
}
Status Push_L(LinkStack *S,pElemType x) //压栈
{
LinkStack p;
p=(LinkStack)malloc(sizeof(Snode));
p->data=x;
p->next=*S;
*S=p;
return 1;
}
Status Pop_L(LinkStack *S,pElemType *temp_) //出栈
{
LinkStack p;
pElemType temp;
if(*S==NULL) return 0;
temp=(*S)->data;
p=*S;
*S=p->next;
free(p);
*temp_=temp;
return 1;
}
Status StackEmpty(LinkStack *S) //判断栈顶是否为空 如果为空返回 0
{
if(*S==NULL) return 0;
else
return 1;
}
以下为二叉树部分:
Status CreateBiTree(BiTNode **T) //先序生成二叉树
{
int ch;
scanf("%d",&ch);
if(ch==0) *T=NULL;
else{
if(!(*T=(BiTNode *)malloc(sizeof(BiTNode))))exit(0);
(*T)->data=ch;
CreateBiTree(&(*T)->lchild);
CreateBiTree(&(*T)->rchild);
}
return 1;
}
}
Status preOrderTraverse(BiTNode *T)//前序遍历二叉树,并统计总结点
{
int i=0;
LinkStack S;
BiTNode *p;
p=T;
Init_StackL(&S);
while(p||StackEmpty(&S)){//StackEmpty(&S)判断栈顶是否为空 如果为空返回 0
if(p){
Push_L(&S,p);
printf("%d\t",p->data);
i++;
p=p->lchild;
}
else{
Pop_L(&S,&p);
if(!(p->data)) return 0;
p=p->rchild;
}
}
// return 1;
printf("\n所有生成节点的总数为:%d\n",i);//总结点
}
Status InOrderTraverse(BiTNode *T) //中序遍历二叉树
{
LinkStack S;
BiTNode *p;
p=T;
Init_StackL(&S);
while(p||StackEmpty(&S)){//StackEmpty(&S)判断栈顶是否为空 如果为空返回 0
if(p){
Push_L(&S,p);
p=p->lchild;
}
else{
Pop_L(&S,&p);
if(!(p->data)) return 0;
printf("%d\t",p->data);
p=p->rchild;
}
}
return 1;
}
void postorder(BiTNode *T)//用递归的方法后续遍历二叉树
{
if(T!=NULL)
{
postorder(T->lchild);
postorder(T->rchild);
printf("%d\t",T->data);
}
}
以下为测试函数,先序生成二叉树:如果为结点空则输入 0。
我们输入的数据为:1 2 4 0 0 5 0 0 3 0 0 ;
void main()
{
BiTNode *T;
printf("请按如下图案先序生成链表,0代表为空:\n");
printf(" ①\n");
printf(" ╱ ╲\n");
printf(" ② ③ \n");
printf(" ╱ ╲\n");
printf("④ ⑤ \n");
printf("输入的数字是1 2 4 0 0 5 0 0 3 0 0 ");
CreateBiTree(&T);
printf(" ①\n");
printf(" ╱ ╲\n");
printf(" ② ③ \n");
printf(" ╱ ╲\n");
printf("④ ⑤ \n");
printf("中序遍历二叉树的结果为:");
InOrderTraverse(T);
printf("\n后续遍历二叉树的结果为:");
postorder(T);//用递归的方法后续遍历二叉树
printf("\n前序遍历二叉树的结果为: ");
preOrderTraverse(T);
printf("\n");
}
程序运行的结果为:
学习数据结构记录,如有错误欢迎指正。
参考书:数据结构 c语言版
来源:oschina
链接:https://my.oschina.net/u/2537692/blog/675132