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

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

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 }


相关文章
排序二叉树的创建及先序、中序、后序输出二叉树
排序二叉树的创建及先序、中序、后序输出二叉树
58 1
|
人工智能 Java 测试技术
二叉树通过前序中序来构建二叉树(炒鸡详细到每一步)
二叉树通过前序中序来构建二叉树(炒鸡详细到每一步)
|
1月前
|
存储 算法
数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
24 0
|
5月前
|
存储 算法 编译器
技术经验解读:二叉树的遍历:先序中序后序遍历的递归与非递归实现及层序遍历
技术经验解读:二叉树的遍历:先序中序后序遍历的递归与非递归实现及层序遍历
38 0
|
5月前
|
存储 算法
数据结构和算法学习记录——二叉树的非递归遍历(中序遍历、先序遍历、后序遍历)
数据结构和算法学习记录——二叉树的非递归遍历(中序遍历、先序遍历、后序遍历)
25 0
【霍罗维兹数据结构】二叉树前中后序遍历 | 层序遍历 | 复制二叉树 | 判断两个二叉树全等 | 可满足性问题
【霍罗维兹数据结构】二叉树前中后序遍历 | 层序遍历 | 复制二叉树 | 判断两个二叉树全等 | 可满足性问题
72 0
|
6月前
|
算法 编译器 C语言
二叉树的创建、销毁、层序遍历与层序遍历的进阶、利用层序遍历判断二叉树是否是为完全二叉树
二叉树的创建、销毁、层序遍历与层序遍历的进阶、利用层序遍历判断二叉树是否是为完全二叉树
非递归方式实现二叉树的前、中、后序遍历
非递归方式实现二叉树的前、中、后序遍历
|
算法 C语言
【递归调用在二叉树中的应用】前序遍历、中序遍历、后序遍历、求二叉树叶子结点及复制二叉树的C语言实现
【递归调用在二叉树中的应用】前序遍历、中序遍历、后序遍历、求二叉树叶子结点及复制二叉树的C语言实现
151 0
【递归调用在二叉树中的应用】前序遍历、中序遍历、后序遍历、求二叉树叶子结点及复制二叉树的C语言实现
|
存储 C++
井号法(#)创建二叉树(利用前序遍历来建树)C++实现
井号法(#)创建二叉树(利用前序遍历来建树)C++实现
159 0
井号法(#)创建二叉树(利用前序遍历来建树)C++实现