• 树的中序非递归遍历


    源码:

      1 #include <iostream>
      2 #include <stack>
      3 using namespace std;
      4 
      5 // 二叉链表表示法
      6 typedef struct _tag_BitTNode
      7 {
      8     // 数据域
      9     char data;
     10     // 左孩子
     11     struct _tag_BitTNode* lChild;
     12     // 右孩子
     13     struct _tag_BitTNode* rChild;
     14 }BiTNode;
     15 
     16 /*
     17     步骤1:
     18     如果结点有左子树,该结点入栈;
     19     如果结点没有左子树,访问该结点;
     20     步骤2:
     21     如果结点有右子树,重复步骤1;
     22     如果结点没有右子树(结点访问完毕),根据栈顶指示回退,访问栈顶元素,并访问右子树,重复步骤1
     23     如果栈为空,表示遍历结束。
     24 
     25 */
     26 // 步骤1
     27 BiTNode* FindLeft(BiTNode* root, stack<BiTNode*> &st)
     28 {
     29     if (root == NULL)
     30     {
     31         return NULL;
     32     }
     33     // 寻找最左的节点
     34     while (root->lChild != NULL)
     35     {
     36         // 该节点入栈
     37         st.push(root);
     38         // 当前指针指向左孩子
     39         root = root->lChild;
     40     }
     41     // 返回没有左孩子的节点
     42     return root;
     43 }
     44 
     45 void MyOrder(BiTNode* root)
     46 {
     47     if (root == NULL)
     48     {
     49         return;
     50     }
     51     stack<BiTNode*> st;
     52     BiTNode* left = FindLeft(root, st);
     53 
     54     while (left != NULL)
     55     {
     56         // 访问
     57         cout << left->data;
     58         // 判断left又没有右子树
     59         if (left->rChild)
     60         {
     61             left = FindLeft(left->rChild, st);
     62         }
     63         else
     64         {
     65             // 没有右子树
     66             // 判断栈是否为空
     67             if (!st.empty())
     68             {
     69                 // 取出栈顶元素
     70                 left = st.top();
     71                 // 弹出
     72                 st.pop();
     73             }
     74             else
     75             {
     76                 cout << "遍历结束!" << endl;
     77                 break;
     78             }
     79         }
     80     }
     81 }
     82 
     83 
     84 // 井号法创建树 -- 先序遍历的方式
     85 BiTNode* createTree()
     86 {
     87     char c;
     88     // 输入节点数据
     89     cin >> c;
     90     if (c == '#')
     91     {
     92         return NULL;
     93     }
     94     // 先创建根节点
     95     BiTNode* root = new BiTNode;
     96     // 初始化
     97     root->data = c;
     98     // 创建左子树
     99     root->lChild = createTree();
    100     // 创建右子树
    101     root->rChild = createTree();
    102 
    103     return root;
    104 }
    105 // 销毁树
    106 void destroyTree(BiTNode* root)
    107 {
    108     // 后序遍历的方式销毁 - 必须
    109     if (root == NULL)
    110     {
    111         return;
    112     }
    113     // 销毁左子树
    114     destroyTree(root->lChild);
    115     // 销毁右子树
    116     destroyTree(root->rChild);
    117     cout << root->data << endl;
    118     // 释放根节点
    119     delete root;
    120 }
    121 
    122 
    123 void main()
    124 {
    125     // 构建一颗二叉树
    126     BiTNode nodeA, nodeB, nodeC, nodeD, nodeE, nodeF, nodeG;
    127     // 初始化
    128     memset(&nodeA, 0, sizeof(BiTNode));
    129     memset(&nodeB, 0, sizeof(BiTNode));
    130     memset(&nodeC, 0, sizeof(BiTNode));
    131     memset(&nodeD, 0, sizeof(BiTNode));
    132     memset(&nodeE, 0, sizeof(BiTNode));
    133     memset(&nodeF, 0, sizeof(BiTNode));
    134     memset(&nodeG, 0, sizeof(BiTNode));
    135 
    136     // 构建树
    137     nodeA.data = 'A';
    138     nodeA.lChild = &nodeB;
    139     nodeA.rChild = &nodeC;
    140 
    141     nodeB.data = 'B';
    142     nodeB.lChild = &nodeD;
    143     nodeB.rChild = &nodeE;
    144 
    145     nodeC.data = 'C';
    146     nodeC.lChild = &nodeF;
    147     nodeC.rChild = &nodeG;
    148 
    149     nodeD.data = 'D';
    150     nodeE.data = 'E';
    151     nodeF.data = 'F';
    152     nodeG.data = 'G';
    153 
    154     printf("树的中序非递归: 
    ");
    155     MyOrder(&nodeA);
    156 
    157     //
    158     cout << "井号法创建树: ABDH#K###E##CFI###G#J##";
    159     BiTNode* root = createTree();
    160     cout << "中序遍历: ";
    161     MyOrder(root);
    162     cout << endl;
    163 
    164     destroyTree(root);
    165 
    166     system("pause");
    167 
    168 }

    运行结果:

  • 相关阅读:
    NSPredicate的用法、数组去重、比较...
    CocoaPods安装和使用教程
    UITableView学习笔记
    Linux dpkg 命令
    Linux rpm 软件包管理命令
    Linux chmod 文件权限命令
    Linux vi 命令
    分库分表背后那些事儿
    Spring Cloud Feign原理及性能
    linux "No space left on device" 磁盘空间解决办法
  • 原文地址:https://www.cnblogs.com/lixuejian/p/10883944.html
Copyright © 2020-2023  润新知