数据结构与算法 ~ 树和二叉树 ~ 使用链表存储,采用递归实现前中后序遍历
#include<stdlib.h>
#include<stdio.h>
/*头结点*/
struct headnode{
int data; /*数据域存放二叉树的结点数*/
struct treenode *next;/*指向二叉树的根结点*/
};
typedef struct headnode *Headnode;
struct treenode{
int data;
struct treenode *left; /*左孩子指针*/
struct treenode *right;/*右孩子指针*/
};
typedef struct treenode *Bitree;
int length;
void Create_Bitree(Headnode head){
int e;
Bitree newnode,pointer,perpointer;
printf("\n=======创建二叉树============\n");
while(1){
printf("\n请输入数据(退出0):");
scanf("%d",&e);
if (e==0) break;
newnode=(Bitree)malloc(sizeof(struct treenode));/*分配结点*/
newnode->data=e;/*初始化结点*/
newnode->left=NULL;
newnode->right=NULL;
if (head->data==0) { head->next=newnode; } /*树空,接为根结点*/
else {
pointer=head->next;
perpointer=pointer;
while (pointer!=NULL){
/*搜索插入位置*/
if ( (newnode->data)<(pointer->data) ){
perpointer=pointer;
pointer=pointer->left;
}else{
perpointer=pointer;
pointer=pointer->right;
}
}/*while*/
if (newnode->data<perpointer->data) /*插入*/
perpointer->left=newnode;
else perpointer->right=newnode;
}/*if*/
head->data++;
}/*while*/
printf("\n二叉树的长度是%d",head->data);
length=head->data;
printf("\n=====二叉树创建结束=======\n");
}/*create bitree*/
void PreorderTraverse(Bitree prenode){
if (prenode!=NULL){
printf("%4d",prenode->data);
PreorderTraverse(prenode->left);
PreorderTraverse(prenode->right);
}/*if*/
}/*PreorderTraverse*/
void InorderTraverse(Bitree prenode){
if (prenode!=NULL){
InorderTraverse(prenode->left);
printf("%4d",prenode->data);
InorderTraverse(prenode->right);
}/*if*/
}/*InorderTraverse*/
void PostorderTraverse(Bitree prenode){
if (prenode!=NULL){
PostorderTraverse(prenode->left);
PostorderTraverse(prenode->right);
printf("%4d",prenode->data);
}/*if*/
}/*PostorderTraverse*/
int formatList(){
int e;
printf("\n=====================================");
printf("\n1---先序遍历输出");
printf("\n2---中序遍历输出");
printf("\n3---后序遍历输出");
printf("\n0---退出");
printf("\n=====================================");
printf("\n请选择:") ;
scanf("%d",&e);
return e;
}
void Print(Headnode head){
int e;
e=formatList();
while (e!=0){
switch(e){
case 1: PrePrint(head);break;
case 2: InPrint(head); break;
case 3: PostPrint(head);break;
default : printf ("输入错误!请重新选择");
}/*switch*/
e=formatList();
}/*while*/
}/*Print*/
int PrePrint(Headnode head){
Bitree prenode;
prenode=head->next;
printf("\n====树的先序遍历开始===\n");
PreorderTraverse(prenode);
printf("\n树的长度是 %d",head->data);
printf("\n====树的先序遍历输出结束===\n");
return 0;
}
int InPrint(Headnode head){
Bitree prenode;
prenode=head->next;
printf("\n====树的中序遍历开始===\n");
InorderTraverse(prenode);
printf("\n树的长度是%d",head->data);
printf("\n====树的中序遍历结束===\n");
return 0;
}
int PostPrint(Headnode head){
Bitree prenode;
prenode=head->next;
printf("\n====树的后序遍历开始===\n");
PostorderTraverse(prenode);
printf("\n树的长度是%d",head->data);
printf("\n====树的后序遍历结束===\n");
return 0;
}
int main(){
Headnode head;
head=(Headnode)malloc(sizeof(struct headnode));
head->data=0;
head->next=NULL;
Create_Bitree(head);
Print(head);
system("pause");
return 0;
}
输入数据如:34,76,45,18,26,54,92
=======创建二叉树============
请输入数据(退出0):34
请输入数据(退出0):76
请输入数据(退出0):45
请输入数据(退出0):18
请输入数据(退出0):26
请输入数据(退出0):54
请输入数据(退出0):92
请输入数据(退出0):0
二叉树的长度是7
=====二叉树创建结束=======
=====================================
1---先序遍历输出
2---中序遍历输出
3---后序遍历输出
0---退出
=====================================
请选择:1
====树的先序遍历开始===
34 18 26 76 45 54 92
树的长度是 7
====树的先序遍历输出结束===
=====================================
1---先序遍历输出
2---中序遍历输出
3---后序遍历输出
0---退出
=====================================
请选择:2
====树的中序遍历开始===
18 26 34 45 54 76 92
树的长度是7
====树的中序遍历结束===
=====================================
1---先序遍历输出
2---中序遍历输出
3---后序遍历输出
0---退出
=====================================
请选择:3
====树的后序遍历开始===
26 18 54 45 92 76 34
树的长度是7
====树的后序遍历结束===
=====================================
1---先序遍历输出
2---中序遍历输出
3---后序遍历输出
0---退出
=====================================
请选择: