/**链式二叉树非递归的前序遍历和中序遍历
*后序遍历比较特殊
**利用顺序栈来存储树的节点
**代码实现如下
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define NAMESIZE 255//字符串的最大长度
#define OK 1
#define ERROR 0
#define MAXSIZE 100//顺序栈的最大长度
static int id=0;//编号
typedef int Statu;//函数返回值的数据类型
typedef char *NameType;//数据域的名称的数据类型
typedef int IdType;//数据域的编号的数据类型
typedef struct elementtype
{
NameType name;//名称
IdType id;//编号
}ElementType;//数据域的结构体
typedef struct linktree
{
ElementType *data;//树节点的数据域
struct linktree *Lchild;//左孩子节点
struct linktree *Rchild;//右孩子节点
}Link_Tree;//树的结构体
void Init_linktree(Link_Tree*tree);//树的初始化
Statu create_linktree(Link_Tree*tree);//树的创建
void preorder_tree(Link_Tree*tree);//非递归的前序遍历
void inorder_tree(Link_Tree*tree);//非递归的中序遍历
void main()
{
Link_Tree*tree;//树的指针
tree=(Link_Tree*)malloc(sizeof(Link_Tree));
if(tree!=NULL)
//对树进行初始化
Init_linktree(tree);
//对其进行创建
printf("根节点:");
int result=create_linktree(tree);
if(result=ERROR)
{
printf("二叉树创建失败\n");
}
else
{
printf("二叉树创建成功\n");
}
printf("非递归的前序遍历\n");
preorder_tree(tree);
printf("\n");
printf("非递归的中序遍历的结果为\n");
inorder_tree(tree);
printf("\n");
}
void Init_linktree(Link_Tree*tree)//树的初始化
{
//对树进行判断是否合法
if(tree==NULL)
{
printf("树的初始化失败\n");
return ;
}
else
{
tree->Rchild=NULL;
tree->Lchild=NULL;//对左右孩子指针进行初始化
}
}
Statu create_linktree(Link_Tree*tree)//树的创建
{
if(tree==NULL)
return ERROR;
char name[NAMESIZE];
gets(name);
if(strcmp(name,"\0")==0)
return ERROR;
else
{
tree->data=(ElementType*)malloc(sizeof(ElementType));
tree->data->name=(NameType)malloc(sizeof(char)*NAMESIZE);
tree->data->id=++id;//编号++
strcpy(tree->data->name,name);//name本身就是一个指针
}
//创建左孩子节点
tree->Lchild=(Link_Tree*)malloc(sizeof(Link_Tree));
//创建右孩子节点
tree->Rchild=(Link_Tree*)malloc(sizeof(Link_Tree));
//对左右孩子进行递归创建
printf("左孩子:");
if(create_linktree(tree->Lchild)==ERROR)
{
//释放节点的内存
tree->Lchild=NULL;
free(tree->Lchild);
}
printf("右孩子:");
if(create_linktree(tree->Rchild)==ERROR)
{
//释放节点的内存
tree->Rchild=NULL;
free(tree->Rchild);
}
return OK;//创建成功
}
void preorder_tree(Link_Tree*tree)//非递归的前序遍历
{
//非递归的前序遍历的思想基栈的先进后出的思想
Link_Tree*n[MAXSIZE];//顺序栈 存储树的节点
int top=0;//栈的top指针
//对指针进行空间
n[top++]=tree;//将根节点进行入栈
printf("[%d,%s]->",tree->data->id,tree->data->name);
Link_Tree*node;//指针变量
node=tree->Lchild;
while(node!=NULL||top!=0)
{
while(node!=NULL)
{
n[top++]=node;
printf("[%d,%s]->",node->data->id,node->data->name);
node=node->Lchild;
}
if(top==0)
return ;
else
{
node=n[--top];
node=node->Rchild;
}
}
}
void inorder_tree(Link_Tree*tree)//非递归的中序遍历
{
Link_Tree* n[MAXSIZE];
int top=0;//top指针
Link_Tree *node;//指针变量
n[top++]=tree;//将根节点进行入栈
node=tree->Lchild;//将指针指向根节点的左孩子
while(node!=NULL||top!=-1)
{
while(node!=NULL)
{
n[top++]=node;
node=node->Lchild;
}
if(top==0)
return ;
else
{
node=n[--top];
printf("[%d,%s]->",node->data->id,node->data->name);
node=node->Rchild;//将指针指向右孩子再次进入循环
}
}
}
/*void postorder_tree(Link_Tree*tree)//非递归的后序遍历
{
//进行后序遍历
Link_Tree*n[MAXSIZE];
int flag;
int top=0;//top指针
n[top++]=tree;//将根节点进行入栈
Link_Tree*node;
node=tree->Lchild;
while(node!=NULL||top!=0)
{
printf("[%d,%s]->",node->data->id,node->data->name);
while(node!=NULL)
{
n[top++]=node;
node=node->Lchild;
}
//printf("[%d,%s]->",node->data->id,node->data->name);
if(top==0)
return ;
else
{
node=n[--top];//出栈
node=node->Rchild;
}
}*/