C语言数据结构链二叉树非递归的前序、中序遍历

/**链式二叉树非递归的前序遍历和中序遍历
*后序遍历比较特殊
**利用顺序栈来存储树的节点
**代码实现如下
*/

#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;

              }


}*/







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章