二叉树的前序遍历
对于一颗二叉树,当遍历它的时候使用
递归总是轻而易举的。
这是二叉树前序遍历-使用递归
public void preorderTraversal(TreeNode root){if(root==null)return;System.out.print(root.data+"  ");preorderTraversal(root.left);preorderTraversal(root.right);}
1.简单几行代码就可以将一颗二叉树遍历完但是递归其中的运算是如何的,我们不需要知道,计算机会用函数栈自己解决,初学递归时,会陷入一种困境,我们总是想钻进递归方法里把每一步都缕清,事实上人脑是不可能把每一步的结果都想出来的,就算写在纸上也无法思考清楚。当然,我们也不需要去钻今递归代码里,我们只需要明白递归用来干什么就行。2.在二叉树的前序遍历中,我们知道前序遍历是先打印根结点,再打印左子树,然后打印右子树。对于树中的每一个结点都符号这个要求,我们不需要关心左子树还有左子树,左子树还有右子树,右子树还有右子树等等无穷无尽的问题因为每一个结点都必须遵守这样的规定,同样,我们也无需过分关心结点为空怎么办空结点的处理应该是细节问题,它不影响前序遍历的规定,放过细节,关心策略。
二叉树和前序遍历-迭代
1.那么当不用递归处理,改用循环迭代进行前序遍历,我们该怎么做呢?2.我们应该关心每一个结点是否应该被
打印输出?关心它的下一个结点该打印哪一个?关心当处理到空结点时候怎么办吗?这些问题都不是我们初步要考虑的,可能会有细节问题,不过细节在代码完善时候再考虑也不迟3.我们只需要明白策略即可。对于二叉树前序遍历,我们知道它的遍历规则,那么我们定义一个 策略【root】

1.我们把二叉树分成三个部分,root结点表示需要当前要打印的的结点,T1表示左子树,T2表示右子树
2.我们不用知道T1或者T2树里面是如何按序打印值的,从总体上看我们只要先打印root,再打印左子树,然后右子树就行了。
3. 策略【root】:表示的就是这种规则,先打印root,再打印T1,再打印T2。它对于每一个结点都适用这种策略
4. 那我们可以轻而易举地写出这种伪代码
 while(root){//打印本结点System.out.print(root.data+"  ");if(T1){打印T1}if(T2){打印T2}}
分析:
1. 每一颗右子树T2都比左子树T1晚打印,我们使用Stack栈来先存放T2树,再存放T1树,这样从整体上看T1树在栈顶将会先释放。
 while(root){//打印本结点System.out.print(root.data+"  ");if(root.right!=null){stack.push(root.right);}if(root.left!=null){stack.push(root.left);}}
这样我们的思维就出来了,先打印root结点,有右子
结点就压入栈,先处理左子结点总体思维有了后,我们处理细节部分,
1. while循环是会接受一个root结点,表示要处理的树的根结点,那么root!=null是while的入口条件,同样如果root结点下没有子结点,也就是说Stack栈没有存放子树那么也就说明栈为空代表无子树迭代结束,!stack.isEmpty()也是while的入口条件2. 每一次进入循环的root是如何确定的?我们知道当第一个root结点进入循环,打印它,并把它的右子树,左子树压入栈

2.当root.left和root.right入栈操作完成后,无论是否都入栈(也许为空),我们的root都应该指向栈顶结点因为下一次循环进入的root就应该是栈顶结点3. 因为循环体内我们使用的是直接System.out结点这样造成栈顶元素无法释放,所以打印完结点后,直接释放栈顶元素
代码
public void preorderTraversal(TreeNode root,Stack<TreeNode> stack){while(!stack.isEmpty() || root!=null){System.out.print(root.data+"  ");if(!stack.isEmpty()){stack.pop();}if(root.right!=null){stack.push(root.right);}if(root.left!=null){stack.push(root.left);}root = stack.isEmpty() ? null : stack.peek();}}
总结
使用迭代对二叉树进行前序遍历,它的遍历策略不难理解,
但是循环的入口,出口并不是那么容易控制,迭代代码并
不难理解,但是很容易形成“一看就懂,一写就废”这篇对于迭代的理解帮助我们学习二叉树遍历时如何处理,
代码是数不尽样式的,但自己的思想却只有自己知道。

二叉树前序遍历-迭代相关推荐

  1. 二叉树遍历-前序遍历-迭代

    前序遍历:根左右,第一次经过节点即打印,直到打印null,往回溯,打印右子树 定义一棵二叉树: 由于采用迭代方式进行遍历,所以在此利用栈(stack)的先进后出特点进行压栈存储节点值,然后再从栈中取出 ...

  2. C语言二叉树前序遍历(附完整源码)

    C语言二叉树前序遍历 C语言二叉树前序遍历完整源码(定义,实现,main函数测试) C语言二叉树前序遍历完整源码(定义,实现,main函数测试) #include <iostream>st ...

  3. 二叉树前序遍历执行过程

    二叉树前序遍历执行过程 前序遍历:根-左-右 图示 记录与总结,2021年 11月 12日 星期五 11:35:14 CST.

  4. 二叉树前序遍历(递归法和迭代法(即非递归法))——C++

    声明:本文原题主要来自力扣力扣,记录此博客主要是为自己学习总结,不做任何商业等活动 本文主要讲解二叉树的前序遍历递归法和迭代法.中序遍历和后序遍历可以参考博主下面两篇博客:二叉树中序遍历(递归法和迭代 ...

  5. C++实现的二叉树前序遍历函数

    #include <iostream> using namespace std;struct TreeNode {int val;TreeNode* left;TreeNode* righ ...

  6. 用Java实现二叉树前序遍历、中序遍历和后序遍历。

    用Java实现二叉树前序遍历.中序遍历和后序遍历. 解析: public class Tree {private int data; /* 数据节点 */private Tree left; /* 左 ...

  7. 树(二叉树层次遍历输出及二叉树前序遍历输入)

    前两篇解释了二叉树的有关逻辑概念及前中后序输出递归代码的实现,这篇将讲述二叉树层次遍历输出如何实现以及二叉树前序遍历输入的两种情况. 定义结构体 struct BiNode{char data;BiN ...

  8. 二叉树前序遍历与后序遍历

    二叉树 前序遍历 递归 借助栈进行排序 先将根节点压栈 栈不为空,如果存在根节点,先右后左. 弹栈打印.直至栈为空 package com.vitamin.tree;import java.util. ...

  9. 顺序二叉树---实现数组的二叉树前序遍历输出

    特点: 1.顺序二叉树只考虑完全二叉树 2.第n个元素的左子节点为2*n+1 3.第n个元素的右子节点为2*n+2 4.第n个元素的父节点为(n-1)/2 代码: /** 给你一个数组,要求以二叉树前 ...

最新文章

  1. 怎样进行FineReader局域网中的分组工作
  2. 【转载】静态时序分析
  3. vue打包的app如何设置自动清理软件缓存_使用Webpack启动你的Vue.js应用
  4. codevs1079 回家
  5. *计算机应用基础* 说课稿,中职计算机应用基础《EXCEL中函数的使用》说课稿.doc...
  6. datagridview设置为勾选才可编辑_使用lightroom前,做好这几项设置,有助于更好使用...
  7. J2EE--Mybatis基础知识题
  8. windows中使用docker构建镜像
  9. 沃特玛采集均衡模块_采集均衡模块以及电池管理系统_2016212573884_说明书_专利查询_专利网_钻瓜专利网...
  10. MobaXterm快捷输入
  11. postgresql 数据库 update 语句的初步使用
  12. Excel:数据转置
  13. 2021年最新AZ自动发卡网源码-全网首发
  14. web01-html and html5
  15. 发明神奇的理发店“魔镜”,可提前预览新发型!
  16. DataGrip如何将创建的console保存路径设置到指定目录?
  17. 【循序渐进学Python】面向对象知多少——魔方方法
  18. 【JAVA】奥林匹克五环(Olympic rings)
  19. 【时空序列预测实战】风险时空预测?keras之ConvLSTM实战来搞定
  20. 进口配额管理和出口配额管理_实行配额许可证管理的进出口商品及其申领方法...

热门文章

  1. C# 使用NPOI库导出excel表格
  2. 《Mastering Adobe Captivate 2019 5th Edition》Adobe Captivate 2019入门精通教程课程书籍电子书教材Windows和macOS通用
  3. 【Python代码/程序综合防护系列第1期】 各层次各方法简介
  4. 移动机器人系列5——机器人的闭环控制
  5. Python基础:面向对象基础 (一) 类及其属性和魔法方法
  6. 前端技术栈:将微信小程序代码自动转换成 Vue 代码
  7. vue学习笔记(3):classList 属性
  8. Zabbix客户端的安装过程
  9. 遇到大牛如何获得联系方式及请教问题
  10. 解读:未来30年新兴科技趋势报告(AI Frist,IoT Second)