二叉树遍历算法的非递归实现

Posted ruruozhenhao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树遍历算法的非递归实现相关的知识,希望对你有一定的参考价值。

  • 前序遍历的非递归实现

 

  • 中序遍历的非递归实现
 1 void InOrder2(BTNode *root) {
 2     BTNode *p = root;
 3     stack<BTNode *> S;
 4     while (p != NULL || !S.empty()) {
 5         if (p) {                        // 找到树中最左边的那个结点,并将路径中经过的结点依次压入栈中
 6             S.push(p);
 7             p = p->left;
 8         } else {                        // 如果该节点为空则输出其双亲结点
 9             S.pop();
10             p = S.top();
11             cout << p->val << " ";
12             p = p->right;               // 访问双亲结点的右孩子
13         }
14     }
15 }

 

  • 后序遍历的非递归实现
 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 const int maxsize = 1005;
 6 
 7 typedef struct BTNode {
 8     int val;
 9     BTNode *left;
10     BTNode *right;
11 };
12 
13 typedef struct {
14     BTNode *p;
15     int revisited;
16 } SNode;
17 
18 void PostOrder2(BTNode *root) {
19     SNode sn;
20     BTNode *pt = root;
21     stack<SNode> S;
22     while (pt) {
23         S.push({pt, 0});
24         pt = pt->left;
25     }
26     while (!S.empty()) {
27         sn = S.top();
28         if (sn.p->right == NULL || sn.revisited == 1) {
29             S.pop();
30             cout << pt->val << " ";
31         } else {
32             sn.revisited = 1;
33             pt = sn.p->right;
34             while (pt != NULL) {
35                 S.push({pt, 0});
36                 pt = pt->left;
37             }
38         }
39     }
40 }

 

以上是关于二叉树遍历算法的非递归实现的主要内容,如果未能解决你的问题,请参考以下文章

《数据结构》遍历二叉树的非递归算法的疑问。

每日一题如何进行二叉树的各种遍历的非递归算法实现?简要讲述。

每日一题如何进行二叉树的各种遍历的非递归算法实现?简要讲述。

23 遍历二叉树的非递归算法

二叉树的非递归遍历

二叉树遍历算法的非递归实现