二叉树的非递归遍历(借鉴递归思想实现非递归遍历)

1 // 树结点定义
2 typedef struct TNode
3 {
4     int value;
5     TNode *left;
6     TNode *right;
7 }*PTNode;

1. 前序遍历的非递归实现(借鉴递归思想实现)

思想:

  • 访问到一结点时,先将其入栈,假设入栈节点为P。
  • 访问P,将P的右孩子和左孩子依次入栈,这样就保证了每次左孩子在右孩子前面被访问。
 1 void preOrderNoneRecursion(PTNode root)
 2 {
 3     if(root == NULL)
 4       return;
 5     PTNode p = root;
 6     stack<PTNode> nodeStack;
 7     nodeStack.push(p);
 8     while(!nodeStack.empty())
 9     {
10       p = nodeStack.top();
11       nodeStack.pop();
12       cout << p->value;
13       if(p->right != NULL)
14         nodeStack.push(p->right);
15       if(p->left != NULL)
16         nodeStack.push(p->left);
17     }
18 }            

2. 中序遍历的非递归实现(借鉴递归思想实现)

// 还没有想出来“借鉴递归思想实现---中序遍历的非递归实现”

3. 后序遍历的非递归实现(借鉴递归思想实现)

思想:

  • 访问到一结点时,先将其入栈,假设入栈节点为P。
  • 如果P没有左孩子和右孩子,则直接访问P;或者P存在左孩子或者右孩子,但是P的左孩子和右孩子都已被访问过,则同样直接访问P。
  • 若不是上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证了每次左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。
 1 void postOrderNoneRecursion(PTNode root)
 2 {
 3     if(root == NULL)
 4       return;
 5     PTNode p = root;
 6     PTNode pre = NULL;
 7     stack<PTNode> nodeStack;
 8     nodeStack.push(p);
 9     while(!nodeStack.empty())
10     {
11       p = nodeStack.top()
12
13       if( (p->left == NULL && p->right == NULL)
14           || ((pre! == NULL) && (pre == p->left || pre == p->right))
15       {
16           cout << p->value;
17           nodeStack.pop();
18           pre = p;
19       }
20       else
21       {
22           if(p->right != NULL)
23             nodeStack.push(p->right);
24         if(p->left != NULL)
25             nodeStack.push(p->left);
26       }
27     }
28 }

参看文章:

http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html

http://blog.csdn.net/sjf0115/article/details/8645991

时间: 2024-10-12 16:56:08

二叉树的非递归遍历(借鉴递归思想实现非递归遍历)的相关文章

二叉树前序、中序和后序的非递归遍历

非递归遍历二叉树利用栈的先进先出特点完成实现 前序比较好理解先压根入栈,在while里面访问根,根出栈,再压入右子树,左子树,这样的遍历二叉树就是前序遍历了. void PrevOrdr_NonR() { stack<BinaryTreeNode<T>*> s; s.push(_root); while(!s.empty()) { BinaryTreeNode<T>* top = s.top(); s.pop(); cout<<top->_data&l

快速排序(递归与分治的思想)

快排具有递归和分治的思想,实现步骤如下. 第一步:对数组A中的第一个元素x执行操作,使得数组变成新的数组B,B中C段表示小于x的元素,D段表示大于x的元素 第二步:把C段,D段,当成2个独立的数组,然后对这2个数组执行类似于第一步中A的操作 第三步:这样B和D数组又同样被分成了三部分,依次类推反复执行相同的操作. 代码: #include<iostream> using namespace std; void swap(int &a,int &b) { int c; c=a;

遍历XML文件添加到TreeView递归调用

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Xml.Linq; namespace 遍历X

二叉树遍历,深度有限遍历,广度优先遍历,前序中序后续优先遍历,层次遍历

首先明白两个概念: 1. 深度遍历包括前中后序遍历三种: 2. 广度优先遍历就是层次遍历. PS: 前中后序遍历,如果使用递归遍历,都很简单易理解: 如果使用非递归方式,首先想到的就应该是使用栈结构来控制整个过程,因为递归也是利用栈来实现的: 前中后序遍历的非递归方式中,后序遍历的非递归方式相比较而言,略复杂. 直接上代码: #include "stdlib.h" #include <iostream> #include <stack> #include <

给定二叉树的先序遍历和中序遍历,输出它的后序遍历序列

这里没再用到先申请大Node数组的方法了,想练练写动态内存分配和释放的,一次OK了,也没怎么出错啊,开心~ 方法二 - Code: //给出一个二叉树的先序遍历和中序遍历,输出它的后序遍历 //直接构造的方法白书已给出.这里是先递归构造二叉树,然后进行后序遍历. #include<stdio.h> #include<string.h> #include<stdlib.h> #define MAXN 1000 typedef struct node { char data

3、二叉树:先序,中序,后序循环遍历详解

原创博客,转载请注明出处,谢谢~~~ 设计二叉树的循环遍历算法对于深刻理解二叉树很有帮助.下面就详细分析3个循环遍历算法. 1.先序循环遍历算法. 在自己设计循环遍历算法的时候,感觉先序遍历算法设计最为容易.下面把设计思路写下来,以防遗忘. 先序循环遍历二叉树的思路最为直接,规则就是: ①. 从根结点开始沿着左孩子一直走到头,在此过程中,每到达一个结点便访问其元素值(如,输出),同时检测该结点是否有右孩子,如果有则将指向右孩子的引用入栈: ②. 第一步完成以后,弹出一个栈顶引用作为本次循环的根节

借鉴DP思想: HouseRobberIII

The thief has found himself a new place for his thievery again. There is only one entrance to this area, called the "root." Besides the root, each house has one and only one parent house. After a tour, the smart thief realized that "all hou

大志非才不就,大才非学不成

零.苦逼码农的自我修养系列 PS:为什么此部分序号是零而不是一?因为这是作为一个码农所应该具有的基础之中的基础,要想做个好码农,此部分还得花大力气啃书啊,这决定了我们看待计算机程序的高度. 0.1 数据结构与算法学习总结系列 (1)你必须知道的指针基础系列: { 预备篇 gcc开发环境搭建 } { 指针的声明和使用.数组与指针的关系 } { 指针的移动.指针的危险 } { sizeof计算长度.strcpy的安全性问题 } { 应用篇 自己实现strlen函数,endsWith函数 } { 内存

交互式shell和非交互式shell、登录shell和非登录shell的区别

交互式shell和非交互式shell.登录shell和非登录shell的区别.首先,这是两个不同的维度来划分的,一个是是否交互式,另一个是是否登录. 交互式shell和非交互式shell(interactive shell and non-interactive shell)交互式模式就是在终端上执行,shell等待你的输入,并且立即执行你提交的命令.这种模式被称作交互式是因为shell与用户进行交互.这种模式也是大多数用户非常熟悉的:登录.执行一些命令.退出.当你退出后,shell也终止了.s