二叉树的三种非递归遍历方式

简介: 二叉树的三种非递归遍历方式

1.先序遍历

 1 void PreorderTraversal(BinTree BT)
 2 {
 3     BinTree T;
 4     std::stack<BinTree> BtStack;
 5     T = BT;
 6     while (T || !BtStack.empty())
 7     {
 8         while (T)
 9         {
10             BtStack.push(T);
11             printf("%c ", T->Data);
12             T = T->Left;
13         }
14         T = BtStack.top();
15         BtStack.pop();
16         T = T->Right;
17 
18     }
19 }

2.中序遍历

 1 void InorderTraversal(BinTree BT)
 2 {
 3     BinTree T;
 4     std::stack<BinTree> BtStack;
 5     T = BT;
 6     while (T || !BtStack.empty())
 7     {
 8         while (T)
 9         {
10             BtStack.push(T);
11             T = T->Left;
12         }
13         T = BtStack.top();
14         BtStack.pop();
15         printf("%c ", T->Data);
16         T = T->Right;
17 
18     }
19 }

.后序遍历(重难点)

在树的结构体结点中添加一个表示访问次数的数据域,visit:

1 typedef Position BinTree;    //二叉树类型
2 struct TNode {
3     ElementType Data;    //结点数据
4     int visit;
5     BinTree Left;        //指向左子树
6     BinTree Right;        //指向右子树
7 };

 遍历的代码程序:

 1 void PostorderTraversal(BinTree BT)
 2 {
 3     BinTree T = BT;
 4     std::stack<BinTree> BtStack;
 5     while (T || !BtStack.empty())
 6     {
 7         while (T)
 8         {
 9             T->visit++;
10             BtStack.push(T);
11             T = T->Left;
12         }
13         if (!BtStack.empty())
14         {
15             T = BtStack.top();        //第二次或第三次访问该结点
16         
17             if (T->visit == 2)                //当visit == 2时,该结点已经被访问了3次,所以可以被输出了
18             {
19                 printf("%c ", T->Data);
20                 BtStack.pop();
21                 T = NULL;
22             }
23             else
24             {
25                 T->visit++;        //第二次访问
26                 T = T->Right;    //即将进入第三次访问
27             }
28         }
29     }
30 }


相关文章
|
5月前
排序二叉树的创建及先序、中序、后序输出二叉树
排序二叉树的创建及先序、中序、后序输出二叉树
27 1
|
3月前
二叉树基础oj练习(对称二叉树、翻转二叉树、另一棵树的子树二叉树的构建及遍历)
二叉树基础oj练习(对称二叉树、翻转二叉树、另一棵树的子树二叉树的构建及遍历)
26 0
|
5月前
【霍罗维兹数据结构】二叉树前中后序遍历 | 层序遍历 | 复制二叉树 | 判断两个二叉树全等 | 可满足性问题
【霍罗维兹数据结构】二叉树前中后序遍历 | 层序遍历 | 复制二叉树 | 判断两个二叉树全等 | 可满足性问题
35 0
|
8月前
|
编译器
深入解析前序遍历:探索二叉树的前进之路
在计算机科学的广袤领域中,数据结构是解决问题的基础,而二叉树作为一种重要且常用的数据结构,为问题的处理提供了高效的方式。在二叉树的世界中,遍历是一项核心操作,它能够让我们有条不紊地访问每一个节点,实现从根部到叶子、从叶子到根部等不同的访问序列。而前序遍历(Preorder Traversal)作为一种经典的遍历方式,在这个过程中扮演着重要角色。
63 0
|
4月前
|
算法 编译器 C语言
二叉树的创建、销毁、层序遍历与层序遍历的进阶、利用层序遍历判断二叉树是否是为完全二叉树
二叉树的创建、销毁、层序遍历与层序遍历的进阶、利用层序遍历判断二叉树是否是为完全二叉树
|
6月前
递归与非递归实现二叉树的前中后序遍历!!
递归与非递归实现二叉树的前中后序遍历!!
23 0
|
11月前
|
存储
非递归方式实现二叉树的前、中、后序遍历
非递归方式实现二叉树的前、中、后序遍历
|
存储 算法 图形学
LeetCode:二叉树的前、中、后序遍历——如何创建一棵【二叉树】
二叉树是一种树形数据结构,其每个节点最多只有两个子节点。通常将节点分为三种类型:根节点、内部节点和叶子节点。其中,根节点是二叉树的唯一访问起点,内部节点具有一个父节点和两个子节点,而叶子节点没有子节点。二叉树的底层数据结构可以使用链表或数组来实现。
|
算法 C语言
【递归调用在二叉树中的应用】前序遍历、中序遍历、后序遍历、求二叉树叶子结点及复制二叉树的C语言实现
【递归调用在二叉树中的应用】前序遍历、中序遍历、后序遍历、求二叉树叶子结点及复制二叉树的C语言实现
122 0
【递归调用在二叉树中的应用】前序遍历、中序遍历、后序遍历、求二叉树叶子结点及复制二叉树的C语言实现
|
存储 C++
二叉树的四种遍历方式(前序遍历,中序遍历,后序遍历,层序遍历)C++语言
二叉树的四种遍历方式(前序遍历,中序遍历,后序遍历,层序遍历)C++语言
200 0