zoukankan      html  css  js  c++  java
  • 王道数据结构 (11) 树的后序遍历非递归代码实现

    代码实现:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define ElementType char
    int top_S1 = -1; //定义栈S1 top下标
    int top_S2 = -1; //定义栈S2 top下标
    
    // 结点结构体
    typedef struct BinTNode
    {
      ElementType data;
      struct BinTNode *left;
      struct BinTNode *right;
    } BinTNode, *BinTree;
    
    // 初始化树形结构
    BinTNode *CreateBiTree(BinTNode *T)
    {
      T = (BinTNode *)malloc(sizeof(BinTNode));
      T->data = 'A';
      T->left = (BinTNode *)malloc(sizeof(BinTNode));
      T->left->data = 'B';
      T->right = (BinTNode *)malloc(sizeof(BinTNode));
      T->right->data = 'C';
    
      T->left->left = (BinTNode *)malloc(sizeof(BinTNode));
      T->left->left->data = 'D';
      T->left->right = (BinTNode *)malloc(sizeof(BinTNode));
      T->left->right->data = 'E';
      T->left->right->left = NULL;
      T->left->right->right = NULL;
      T->left->left->left = (BinTNode *)malloc(sizeof(BinTNode));
      T->left->left->left->data = 'H';
      T->left->left->left->left = NULL;
      T->left->left->left->right = NULL;
      T->left->left->right = (BinTNode *)malloc(sizeof(BinTNode));
      T->left->left->right->data = 'I';
      T->left->left->right->left = NULL;
      T->left->left->right->right = NULL;
    
      T->right->left = (BinTNode *)malloc(sizeof(BinTNode));
      T->right->left->data = 'F';
      T->right->left->left = NULL;
      T->right->left->right = NULL;
      T->right->right = (BinTNode *)malloc(sizeof(BinTNode));
      T->right->right->data = 'G';
      T->right->right->left = NULL;
      T->right->right->right = NULL;
    
      return T;
    }
    
    // 栈S1 - 进栈push
    void push_S1(BinTNode **stack, BinTNode *elem)
    {
      stack[++top_S1] = elem;
    }
    
    // 栈S2 - 进栈push
    void push_S2(BinTNode **stack, BinTNode *elem)
    {
      stack[++top_S2] = elem;
    }
    
    //栈S1 - 弹栈pop
    void pop_S1()
    {
      if (top_S1 == -1)
      {
        return;
      }
      top_S1--;
    }
    
    //栈S2 - 弹栈pop
    void pop_S2()
    {
      if (top_S2 == -1)
      {
        return;
      }
      top_S2--;
    }
    
    // 遍历过程中,输出结点值
    void printElement(BinTNode *elem)
    {
      printf("%c ", elem->data);
    }
    
    //获取栈顶元素
    BinTNode *getTop_S1(BinTNode **stack)
    {
      return stack[top_S1];
    }
    
    //获取栈顶元素
    BinTNode *getTop_S2(BinTNode **stack)
    {
      return stack[top_S2];
    }
    
    //非递归遍历 - 左右根
    void PostOrderTraverse(BinTNode *Tree)
    {
      BinTNode *S1[30]; // 辅助栈
      BinTNode *S2[30];
      BinTNode *T = Tree; // 定义临时指针
      BinTNode *Temp;
      push_S1(S1, T); // 初始化S1的top元素是树的根结点
      while (top_S1 != -1)
      {
        T = getTop_S1(S1); // S1的栈顶元素弹出
        pop_S1();          // 栈顶元素弹栈
        push_S2(S2, T);
    
        if (T->left != NULL || T->right != NULL)
        { // 栈顶元素有孩子结点
          if (T->left != NULL)
            push_S1(S1, T->left);
          if (T->right != NULL)
            push_S1(S1, T->right);
        }
      }
      // 逐个弹出S2的元素
      while (top_S2 != -1)
      {
        printElement(getTop_S2(S2));
        pop_S2();
      }
    }
    
    int main()
    {
      BinTNode *Tree;
      Tree = CreateBiTree(Tree);
      printf("后序遍历:	");
      PostOrderTraverse(Tree);
      printf("
    ");
      return 0;
    }

    输出:

    转载: https://zhuanlan.zhihu.com/p/136124168

  • 相关阅读:
    IIS禁止xml文件访问
    微信三方授权域名问题
    微信公众号接收推送
    微信菜单保存
    微信三方授权 二维码获取问题 以及网页显示问题
    控制input框的内容输入为数字
    select 相关 获取当前项以及option js选定
    子窗口调用父窗口方法
    免费在线的web性能测试网站
    【原创】Kakfa utils源代码分析(三)
  • 原文地址:https://www.cnblogs.com/guangzhou11/p/13410622.html
Copyright © 2011-2022 走看看