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

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 }

3.后序遍历(重难点)

在树的结构体结点中添加一个表示访问次数的数据域,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 }

原文地址:https://www.cnblogs.com/hi3254014978/p/9746060.html

时间: 2024-11-09 05:55:09

二叉树的三种非递归遍历方式的相关文章

二叉树的先序非递归遍历(注释版)

/* No recusive to realize the travle of tree */ void NoPreOrder( BiTree root ) {/*{{{*/ Stack S; BiTree P; P = root; S = CreateStack(); while( P!=NULL || !IsEmpty(S) )//判断条件分别对应着 //1,S is not empty && P = NULL 当前节点为上一节点的右子树,右子树为空,但还有上一节点的上一节点的右子树

二叉树的中序非递归遍历思想

#include<stdio.h> #include<stdlib.h> #define OK 1 #define  ERROR 0 typedef struct node { int data; struct node *lchild; struct node *rchild; } Node,Tree; /* www.quzhuanpan.com 解释全来自去转盘网,转载请告知 */ typedef Node *ElemType; typedef Tree *AnoElemTyp

【转】更简单的非递归遍历二叉树的方法

解决二叉树的很多问题的方案都是基于对二叉树的遍历.遍历二叉树的前序,中序,后序三大方法算是计算机科班学生必写代码了.其递归遍历是人人都能信手拈来,可是在手生时写出非递归遍历恐非易事.正因为并非易事,所以网上出现无数的介绍二叉树非递归遍历方法的文章.可是大家需要的真是那些非递归遍历代码和讲述吗?代码早在学数据结构时就看懂了,理解了,可为什么我们一而再再而三地忘记非递归遍历方法,却始终记住了递归遍历方法? 三种递归遍历对遍历的描述,思路非常简洁,最重要的是三种方法完全统一,大大减轻了我们理解的负担.

【算法导论】二叉树的前中后序非递归遍历实现

二叉树的递归遍历实现起来比较简单,而且代码简洁:而非递归遍历则不那么简单,我们需要利用另一种数据结构---栈来实现.二叉树的遍历又可以分为前序.中序和后序三种,它们是按照根结点在遍历时的位置划分的,前序遍历则根结点先被遍历,中序则根结点在左右叶子节点之间被遍历,后序则是根结点最后被遍历.三种非递归遍历中,前序和中序都不是太复制,而后序遍历则相对较难. 一.前序遍历 我们这里前序遍历按照"根-左-右"的顺序来遍历.这里按照"递归--非递归"的次序来研究,之后的几种亦是

二叉树之非递归遍历

1.二叉树的遍历 为什么要有遍历操作:将线性结构-------->非线性结构: 将递归程序-------->非递归程序: 2.二叉树的三种递归遍历: 先序遍历:先访问根(父)结点,在访问左分支,最后访问右分支: 中序遍历:先访问左分支,在根结点,最后右分支: 后序遍历:先访问左分支,在访问右分支,最后访问根节点: 所有程序皆正确测试过,后面将给完整程序和测试程序,测试结果. 以下就是递归遍历,先序,中序,后序: 下面的都是在类外定义的函数,所以为模板函数: //先序遍历 template<

重拾算法(1)——优雅地非递归遍历二叉树及其它

重拾算法(1)——优雅地非递归遍历二叉树及其它 本文中非递归遍历二叉树的思想和代码都来自这里(http://jianshu.io/p/49c8cfd07410#).我认为其思想和代码都足够优雅动人了,于是稍作整理,得到如下的程序. 前中后序遍历二叉树 1 public class BinaryTreeNode<T> 2 { 3 public T Value { get;set; } 4 public BinaryTreeNode<T> Parent { get;set; } 5 p

树的非递归遍历——前序、中序、后序

树的递归遍历非常简单,也是写树的遍历时最常用的写法.但是我发现自己对树的非递归遍历并不十分熟悉,所以把三种非递归遍历都写了一遍,以后看到这篇记录博客也可以帮助自己好好回想熟悉一下. Leetcode对应习题:前序,中序,后序. 相对而言,这三种非递归遍历的难度--前序 < 中序 < 后序. 对于第三种(非递归后序遍历)方法,只要稍微调整下第18~19行三个节点push的顺序,就可以实现前中后序的遍历. 树的非递归前序: 1 class Solution { 2 public: 3 vector

史上最简明易懂非递归遍历二叉树算法

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 遍历二叉树的递归函数是体现了算法之美的高妙算法,思路清晰,代码简洁,读之赏心悦目.代码例如以下: 程序代码: void PreOrderTraverse_R(BiTree BT)//採用递归方式先序遍历二叉树BT { if(BT != NULL) { printf("%c", BT->data);//输出该结点(根结点) PreOrderTraverse_R(BT->lchi

数据结构二叉树——建立二叉树、中序递归遍历、非递归遍历、层次遍历

数据结构二叉树-- 编写函数实现:建立二叉树.中序递归遍历.借助栈实现中序非递归遍历.借助队列实现层次遍历.求高度.结点数.叶子数及交换左右子树. ("."表示空子树) #include<stdio.h> #include<stdlib.h> //***********二叉树链表节点结构 typedef char DataType; typedef struct Node {  DataType data;  struct Node*LChild;  struc