鱼C论坛

 找回密码
 立即注册
查看: 2962|回复: 1

[技术交流] 二叉树非递归建立及非递归遍历前中序

[复制链接]
发表于 2021-1-22 18:16:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
后序遍历我还没有整清楚

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef char Elemtype;

  4. typedef struct Node                        //建立二叉树属性
  5. {
  6.         Elemtype litter;
  7.         struct Node *left;
  8.         struct Node *right;
  9. }Node, *Nodle;

  10. typedef struct Diss                        //建立链表站
  11. {
  12.         Node *time;
  13.         struct Diss *next;
  14. }Diss, *Dog;

  15. void prin_explain();
  16. void push_stree(Dog *F, Node *Tim);
  17. void get_stree(Nodle *T);        //创建二叉树
  18. void prin_stree(Node *T);        //前序打印二叉树
  19. void prin_stree_two(Node *T);        //中序打印二叉树
  20. //void prin_stree_three(Node *T);        //后序打印二叉树
  21. void prin_stree_foure(Node *T);        //测试打印二叉树

  22. void push_stree(Dog *F, Node *Tim)                        //前叉建立栈
  23. {
  24.         Diss *temp;
  25.         temp = (Diss *)malloc(sizeof(Diss ));
  26.         temp->time = Tim;

  27.         if (*F == NULL)
  28.         {
  29.                 *F = temp;
  30.                 temp->next = NULL;
  31.         }
  32.         else
  33.         {
  34.                 temp->next = *F;
  35.                 *F = temp;
  36.         }       
  37. }
  38. void prin_stree_four(Node *T)
  39. {
  40.         if (T != NULL)
  41.         {
  42.                 prin_stree_four(T->left);
  43.                 prin_stree_four(T->right);
  44.                 printf("%c", T->litter);
  45.         }
  46. }
  47. /*void prin_stree_three(Node *T)
  48. {
  49.         Diss *F, *N;
  50.         F = (Diss *)malloc(sizeof(Diss ));
  51.         F = NULL;
  52.        
  53.         while (1)
  54.         {
  55.                 if (F == NULL && T==NULL)
  56.                 {
  57.                         break;
  58.                 }
  59.                 while (T != NULL)
  60.                 {
  61.                         push_stree(&F, T);
  62.                         T = T->left;       
  63.                 }
  64.                 T = F->time->right;
  65.                 N = F;
  66.                 F = F->next;
  67.                 free(N);
  68.         }
  69.        
  70. }*/
  71. void prin_stree_two(Node *T)
  72. {
  73.         Diss *F, *N;
  74.         F = (Diss *)malloc(sizeof(Diss ));
  75.         F = NULL;
  76.        
  77.        
  78.        
  79.         while (1)
  80.         {
  81.                 if (F == NULL && T==NULL)
  82.                 {
  83.                         break;
  84.                 }
  85.                 while (T != NULL)
  86.                 {
  87.                         push_stree(&F, T);
  88.                         T = T->left;
  89.                 }
  90.                 printf("%c", F->time->litter);
  91.                 T = F->time->right;
  92.                 N = F;
  93.                 F = F->next;
  94.                 free(N);
  95.         }

  96. }
  97. void prin_stree(Node *T)
  98. {
  99.         Diss *F, *N;
  100.         F = (Diss *)malloc(sizeof(Diss ));
  101.         F = NULL;

  102.        

  103.         while (1)
  104.         {
  105.                 if (F == NULL && T==NULL)
  106.                 {
  107.                         break;
  108.                 }
  109.                 while (T != NULL)
  110.                 {
  111.                         printf("%c", T->litter);
  112.                         push_stree(&F, T);
  113.                         T = T->left;
  114.                 }
  115.                 T = F->time->right;
  116.                 N = F;
  117.                 F = F->next;
  118.                 free(N);
  119.         }
  120. }
  121. void get_stree(Nodle *T)
  122. {
  123.         Diss *F = NULL, *N;
  124.         Elemtype ch, cg;
  125.         Node *Temp;

  126.         while (1)
  127.         {
  128.                 if (F == NULL && *T != NULL)                //结束本程序条件
  129.                 {
  130.                         break;
  131.                 }
  132.                 do
  133.                 {
  134.                         scanf("%c", &ch);
  135.                        
  136.                         if (ch == ' ')
  137.                         {
  138.                                 Temp = NULL;                                               
  139.                         }
  140.                         else                                                        //获得节点并输入数据
  141.                         {
  142.                                 Temp = (Node *)malloc(sizeof(Node ));
  143.                                 Temp->litter = ch;
  144.                         }

  145.                         if (*T == NULL)
  146.                         {
  147.                                 *T = Temp;
  148.                         }
  149.                         else                                                        //与头部节点连接
  150.                         {
  151.                                 if (cg ==' ')
  152.                                 {
  153.                                         F->time->right = Temp;                //向右变量中插入数据
  154.                                         N = F;
  155.                                         F = F->next;
  156.                                         free(N);                                        //释放栈中数据;空间回收
  157.                                 }
  158.                                 else
  159.                                 {
  160.                                         F->time->left = Temp;                //用栈作为静态变量,节省空间
  161.                                 }
  162.                         }
  163.                         cg = ch;                                        //标记符用于记录上一次循环ch的状态
  164.                         if (Temp != NULL)                        //向栈中输入变量
  165.                         {
  166.                                 push_stree(&F, Temp);
  167.                         }       
  168.                 } while (ch != ' ');
  169.         }
  170. }
  171. void prin_explain()
  172. {
  173.         printf("1、非递归创建二叉树\n");
  174.         printf("2、前序非递归打印二叉树\n");
  175.         printf("3、中序非递归打印二叉树\n");
  176.         printf("4、测试递归打印二叉树\n");
  177.         printf("9、¥ 结束本程序 ¥\n");
  178. }

  179. int main()
  180. {
  181.         int number;
  182.         Node *T = NULL;

  183.         prin_explain();


  184.         do
  185.         {
  186.                 scanf("%d", &number);
  187.                 getchar();

  188.                 switch (number)
  189.                 {
  190.                 case 1:
  191.                         {
  192.                                 get_stree(&T);               
  193.                         }
  194.                         break;
  195.                 case 2:
  196.                         {
  197.                                 prin_stree(T);
  198.                                 putchar('\n');
  199.                         }
  200.                         break;
  201.                 case 3:
  202.                         {
  203.                                 prin_stree_two(T);
  204.                                 putchar('\n');
  205.                         }
  206.                         break;
  207.                 case 4:
  208.                         {
  209.                                 prin_stree_four(T);
  210.                                 putchar('\n');
  211.                         }
  212.                         break;
  213.                 case 9:
  214.                                                                         //结束本程序
  215.                         break;
  216.                 default:
  217.                         printf("您所输入的数据有误请从新输入!\n");
  218.                         break;
  219.                         }
  220.         }while (number != 9);

  221.         return 0;
  222. }

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-23 11:02:17 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>
#define StackMax 100

typedef struct Node
{
    char data;
    struct Node *LChild;
    struct Node *RChild;
} BiNode, *BiTree;

typedef struct
{
    BiTree data[StackMax];
    int top;
} Stack;

BiTree CreateTree();                //建立二叉树
void InitStack(Stack *S);           //栈的初始化
int EmptyStack(Stack S);            //栈判空
int FullStack(Stack S);             //栈判满
void PushStack(Stack *S, BiTree T); //入栈
void PopStack(Stack *S, BiTree *T); //出栈
void GetTop(Stack S, BiTree *T);    //获取栈顶端元素
void PreoderTree(BiTree T);         //前序遍历
void Preoder(BiTree T);             //迭代前序遍历
void InPrintTree(BiTree T);         //中序遍历
void InOrder(BiTree T);             //迭代中序遍历
void PostPrintTree(BiTree T);       //后序遍历
void PostOrder(BiTree T);           //迭代后序遍历

int main()
{
    BiTree T;
    T = CreateTree();
    printf("递归前序输出:\n");
    PreoderTree(T);
    printf("\n迭代前序输出:\n");
    Preoder(T);
    printf("\n递归中序输出:\n");
    InPrintTree(T); //递归中序
    printf("\n迭代中序输出:\n");
    InOrder(T); //非递归中序
    printf("\n递归后序输出:\n");
    PostPrintTree(T); //递归后序
    printf("\n迭代后续输出:\n");
    PostOrder(T); //非递归后序
    return 0;
}

//建立二叉树
BiTree CreateTree()
{
    char c;
    c = getchar();
    BiTree T;
    if (' ' == c)
    {
        return NULL;
    }
    else
    {
        T = (BiTree)malloc(sizeof(BiNode));
        T->data = c;
        T->LChild = CreateTree();
        T->RChild = CreateTree();
    }
    return T;
}

//栈的初始化
void InitStack(Stack *S)
{
    S->top = -1;
}

//栈判空
int IsEmptyStack(Stack S)
{
    if (-1 == S.top)
    {
        return 1;
    }
    return 0;
}

//栈判满
int IsFullStack(Stack S)
{
    if (S.top == StackMax - 1)
    {
        return 1;
    }
    return 0;
}

//入栈
void PushStack(Stack *S, BiTree T)
{
    if (IsFullStack(*S))
    {
        printf("栈满 ");
        return;
    }
    S->top++;
    S->data[S->top] = T;
}

//出栈
void PopStack(Stack *S, BiTree *T)
{
    if (IsEmptyStack(*S))
    {
        printf("栈满 ");
        return;
    }
    (*T) = S->data[S->top];
    S->top--;
}

//获取栈顶端元素
void GetTop(Stack S, BiTree *T)
{
    if (IsEmptyStack(S))
    {
        printf("栈满 ");
        return;
    }
    (*T) = S.data[S.top];
}

//递归前序输出
void PreoderTree(BiTree T)
{
    if (T == NULL)
    {
        return;
    }
    printf("%c", T->data);
    PreoderTree(T->LChild);
    PreoderTree(T->RChild);
}

//迭代前序输出
void Preoder(BiTree T)
{
    Stack S;
    InitStack(&S);
    BiTree tmp;
    tmp = T;
    while (tmp != NULL || !IsEmptyStack(S))
    {
        if (tmp != NULL)
        {
            PushStack(&S, tmp);
            printf("%c", tmp->data);
            tmp = tmp->LChild;
        }
        else
        {
            PopStack(&S, &tmp);
            tmp = tmp->RChild;
        }
    }
}
//递归中序输出
void InPrintTree(BiTree T)
{
    if (T == NULL)
    {
        return;
    }
    InPrintTree(T->LChild);
    printf("%c", T->data);
    InPrintTree(T->RChild);
}

//迭代中序遍历
void InOrder(BiTree T)
{
    Stack S;
    InitStack(&S);
    BiTree tmp;
    tmp = T;
    while (tmp != NULL || !IsEmptyStack(S))
    {
        if (tmp != NULL)
        {
            PushStack(&S, tmp);
            tmp = tmp->LChild;
        }
        else
        {
            PopStack(&S, &tmp);
            printf("%c", tmp->data);
            tmp = tmp->RChild;
        }
    }
}

//递归后序输出
void PostPrintTree(BiTree T)
{
    if (T == NULL)
    {
        return;
    }
    PostPrintTree(T->LChild);
    PostPrintTree(T->RChild);
    printf("%c", T->data);
}

//迭代后序遍历
void PostOrder(BiTree T)
{
    Stack S;
    InitStack(&S);
    BiTree p, q;
    p = T;
    q = NULL;
    while (p != NULL || !IsEmptyStack(S))
    {
        if (p != NULL)
        {
            PushStack(&S, p);
            p = p->LChild;
        }
        else
        {
            GetTop(S, &p);
            if (p->RChild != NULL && p->RChild != q)
            {
                p = p->RChild;
            }
            else
            {
                printf("%c", p->data);
                q = p;
                PopStack(&S, &p);
                p = NULL;
            }
        }
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-5 12:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表