数据结构与算法 ~ 树和二叉树 ~ 非递归的前中序遍历(使用链表存储)
/*tree-Traverse no recursion*/
#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 InorderTraverse(Headnode head){
int i,e;
int *stack[10];
/*设置一个指针数组,用于存放遍历时的结点地址*/
int top=0,base=0;
Bitree pointer;
printf("\n==非递归的中序遍历: ");
for(i=0;i<10;++i)
stack[i]=0;/*初始化栈*/
pointer=head->next;
while(pointer!=NULL||base!=top){
if (pointer!=NULL){
stack[top++]=pointer; /*根结点地址进栈*/
pointer=pointer->left; /*访问左子树*/
}/*if*/
else{ /*从左子树返回*/
pointer=stack[--top]; /*取出根结点地址*/
printf("%d ",pointer->data);/*输出信息*/
pointer=stack[top];
pointer=pointer->right; /*进入右子树*/
}/*else*/
}/*while*/
printf("输出结束\n");
}/*InorderTraverse*/
/*利用链表结构前序遍历二叉树*/
void PreorderTraverse(Headnode head){
int i,e;
int *stack[10];
/*设置一个指针数组,用于存放遍历时的结点地址*/
int top=0,base=0;
Bitree pointer;
printf("\n==非递归的前序遍历: ");
for(i=0;i<10;++i) stack[i]=0;/*初始化栈*/
pointer=head->next;
stack[top++]=NULL;
while(pointer!=NULL){
printf("%d ",pointer->data);
if (pointer->right!=NULL)/*右子树非空*/
stack[top++]=pointer->right;/*右子树根结点进栈*/
if (pointer->left!=NULL) /*左子树非空*/
pointer=pointer->left; /*进入左子树准备访问*/
else pointer=stack[--top]; /*否则从栈中取出最近的右子树地址准备访问*/
}/*while*/
printf("输出结束\n");
}/*PreorderTraverse*/
int main(){
Headnode head;
head=(Headnode)malloc(sizeof(struct headnode));
head->data=0;
head->next=NULL;
Create_Bitree(head);
InorderTraverse(head);
PreorderTraverse(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
=====二叉树创建结束=======
==非递归的中序遍历: 18 26 34 45 54 76 92 输出结束
==非递归的前序遍历: 34 18 26 76 45 54 92 输出结束
请按任意键继续. . .