【数据结构基础复习】二叉树的非递归遍历(二)
一、绪论
上一章中,我们粗略的复习了二叉树的遍历,不过是采用递归的方式遍历的。扩展来说,二叉树的遍历是可以推广到任何树结构的。但是,这里要强调一下,任何递归方法可以解决的问题都能用非递归的方法去实现。因为递归的思想是利用函数栈来保存信息,我们可以使用自己写的数据结构来代替函数栈,所以也可以实现相同的目的。
二、目的
采用非递归的方式实现对二叉树的遍历。
2.1、先序遍历
拿先序遍历为例,介绍思想如下:
1、申请新的栈,记作stack。将头节点root压入栈中;
2、从栈中弹出栈顶节点,记作cur,打印cur的value,再将cur的右子节点(if !=null)压入栈中,最后将cur的左子节点(if !=null)压入栈中;
3、重复2,直到stack为空,过程结束。
1 public void preOrderUnRecur(Node head){ 2 if(head != null){ 3 Stack<Node> stack = new Stack<Node> () ; 4 stack.add(head) ; 5 6 while(stack!=null){ 7 head = stack.pop() ; 8 System.out.println(head.value+" ") ; 9 if(head.right!=null){ 10 stack.push(head.right) ; 11 } 12 13 if(head.left!=null){ 14 stack.push(head.left) ; 15 } 16 } 17 } 18 }
View Code
2.2、中序遍历
其实本质上来说,先序和中序的差异不大,他的目的先是将左子树压入栈中,再取出来,弹出来的时候仍要判断右子树是否为空。
1、申请新的栈stack,将根节点root压入栈中 ;
2、如果栈和节点root不为空,则将root.left压入栈中,直到root.left==null ;
3、弹出栈的元素,如果弹出来的节点有右子节点,则将右子节点加入栈中,进入2中循环 ;
4、循环到stack.isEmpty() && root == null ;
1 public void inOrderUnRecur( Node head ){ 2 if(head!=null){ 3 Stack<Node> stack = new Stack<Node>() ; 4 5 while(!(stack.isEmpty() && head == null)){ 6 if(head!=null){ 7 stack.push(head) ; 8 head = head.left ; 9 }else{ 10 head=stack.pop() ; 11 System.out.println(head.value + " ") ; 12 head = head.right ; 13 } 14 } 15 16 } 17 }
View Code
2.3、后序遍历
后序遍历会稍微复杂一点,按照步骤来说,有如下操作:
1、建立新栈,将头节点压入栈中;
2、如果栈不为空会一直循环,在循环体内,另一个index来记录栈顶元素;
3、判断,如果,栈顶元素index的左子节点不为空,并且不等于根节点的左子节点和右子节点,证明这个index的左边还没有遍历过,将index.left压入栈中;
4、判断,如果,栈顶元素index的右子节点不为空,并且不等于根节点的右子节点,证明这恶index的右边没有遍历过,将index.right压入栈中;
5、否则,将输出根节点,并且令栈顶元素 = 根节点 。
1 public void posOrderUnRecur01(Node head){ 2 if(head != null) { 3 Node index = null; 4 Stack<Node> stack = new Stack<Node>() ; 5 stack.push(head) ; 6 7 8 while (!stack.isEmpty()){ 9 index = stack.peek() ; 10 if(index.left!=null && head!=index.left && head!=index.right){ 11 stack.push(index.left) ; 12 }else if(index.right!=null && head!=index.right){ 13 stack.push(index.right) ; 14 }else { 15 System.out.print(stack.pop().value+" ") ; 16 head = index ; 17 } 18 } 19 20 } 21 }
View Code
转载于:https://www.cnblogs.com/panghaohan/p/6526956.html
【数据结构基础复习】二叉树的非递归遍历(二)相关推荐
- 数据结构-二叉树的非递归遍历
前面的章节我们实现了二叉树最基本的遍历方式:递归遍历,代码是如此的简洁:辣么我们为什么还要去学习二叉树的非递归遍历方式呢?众所周知,递归优点是将可以将复杂的问题简单化即大问题拆分成一个个小问题,那么它 ...
- 二叉树的非递归遍历(c/c++)
由于递归算法相对于非递归算法来说效率通常都会更低,递归算法会有更多的资源需要压栈和出栈操作(不仅仅是参数,还有函数地址等)由于编译器对附加的一些栈保护机制会导致递归执行的更加低效,使用循环代替递归算法 ...
- c语言以顺序结构存储的二叉树的非递归遍历,C语言二叉树的非递归遍历实例分析...
本文以实例形式讲述了C语言实现二叉树的非递归遍历方法.是数据结构与算法设计中常用的技巧.分享给大家供大家参考.具体方法如下: 先序遍历: void preOrder(Node *p) //非递归 { ...
- 树:二叉树的非递归遍历算法
二叉树的递归遍历 二叉树的递归遍历算法,写法很简单,比如说前序遍历树,如下: //前序遍历 void PreOrderTraverse(BiTree tree) {if (NULL != tree){ ...
- 刷题:二叉树的非递归遍历方式
二叉树的非递归的遍历方式 上篇博客记录了二叉树的递归遍历方式以及根据二叉树的遍历结果还原二叉树的内容. 本篇博客记录二叉树的非递归的遍历方式. 二叉树的非递归遍历需要借助栈来实现,而且三种遍历的方式的 ...
- 二叉树的非递归遍历(统一的模板)
二叉树的非递归遍历 前言 树的存储结构 先序遍历 先序的递归遍历 先序的非递归遍历 中序遍历 中序的递归遍历 中序遍历的非递归算法 后序遍历 后序的递归遍历 后序的非递归遍历 层次遍历 层次遍历获得每 ...
- 6-9 二叉树的非递归遍历 (20 分)
** 6-9 二叉树的非递归遍历 (20 分) ** 本题要求用非递归的方法实现对给定二叉树的 3 种遍历. 函数接口定义: void InorderTraversal( BinTree BT ); ...
- C/C++ 二叉树的非递归遍历(前序、中序、后序非递归遍历)
二叉树的非递归遍历C/C++实现: 非递归先序遍历代码: void PreOrderTraversal (struct tree* root) { //非递归先序遍历struct tree* t ...
- C语言实现二叉树的非递归遍历
C语言实现二叉树的非递归遍历: 代码解释: 非递归前序遍历:1> 首先建立一个二维指针,用来存储每个结点的地址,定义栈顶指针top,初始值为-1,并将根结点存入栈中,top++:2> 进入 ...
- 二叉树的非递归遍历(C语言实现)
上一篇讨论了二叉树的的递归遍历,这一次讨论二叉树的三种非递归遍历 二叉树的非递归遍历采用栈实现,首先给出二叉树和栈的定义 #define STACK_INIT_SIZE 100 #define STA ...
最新文章
- 卷积神经网络(CNN)实现CIFAR100类别分类
- grep / egrep
- python 样本均值t检验_假设检验与单样本T检验(上)
- linux 进程死循环,Linux下如何处理一次用户态进程死循环问题
- Radware发布2015-2016年全球应用及网络安全报告
- c语言qt生成dll与加载dll,Qt制作界面的DLL以及调用
- C++中set按降序排序
- 4.3.2 用jQuery进行异步加载(1)
- html div画圆有什么用,圆形div栏,用于评级html5 js(Circle div bar for rating html5 js)
- Linux 命令(78)—— rmdir 命令
- mysql 查询之聚合查询
- 纯CSS Lightbox效果
- linux 远程安装teamviewer,远程桌面工具TeamViewer教程:如何在红帽® 企业Linux®上安装TeamViewer...
- 小米5splus(高配版/全网通)线刷兼救砖_解账户锁_纯净刷机包_教程
- 中级软件工程师资格证_软件工程师资格等级:初级,中级和高级
- 从历史故事看企业用人-之二--三国之东吴
- 一线明星纷纷失业,数据告诉你今年的演员有多难
- iphone日历怎么跳转日期_苹果手机日历怎么指定日期提醒?
- java递归获取所有的子级节点
- 如何制作SOLIDWORKS材料明细表模板