• 二叉树的前序遍历
    • 题目描述
    • 思路
    • 代码
  • 二叉树的中序遍历
    • 题目描述
    • 思路
    • 代码
  • 二叉树的后序遍历
    • 题目描述
    • 思路
    • 代码
  • 二叉树的层序遍历
    • 题目描述
    • 前提知识
    • 代码

二叉树的前序遍历

144.二叉树的前序遍历

题目描述

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

提示:

树中节点数目在范围 [0, 100] 内
-100 <= Node.val <= 100

思路

我们知道前序遍历是按照根–>左子树–>右子树的顺序来遍历的,如果要使用迭代的方法来解决,我们可以使用栈来解决,先把根节点放入栈中,然后将右孩子加入栈,再加入左孩子。因为这样子进栈后,出栈的顺序就是根–>左子树–>右子树

代码

class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> list=new ArrayList();Stack<TreeNode> stack=new Stack();if(root==null){return list;}//只要栈非空,则把栈顶元素弹出stack.push(root);while(!stack.isEmpty()){TreeNode node= stack.pop();list.add(node.val);if(node.right!=null){stack.push(node.right);}if(node.left!=null){stack.push(node.left);}}return list;}
}

二叉树的中序遍历

题目描述

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

提示:

树中节点数目在范围 [0, 100] 内
-100 <= Node.val <= 100

思路

中序遍历是左中右,先访问的是二叉树顶部的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点(也就是在把节点的数值放进result数组中)
那么在使用迭代法写中序遍历,就需要借用指针的遍历来帮助访问节点,栈则用来处理节点上的元素。

代码

class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> result = new ArrayList<>();if (root == null){return result;}Stack<TreeNode> stack = new Stack<>();TreeNode cur = root;while (cur != null || !stack.isEmpty()){if (cur != null){stack.push(cur);cur = cur.left;}else{cur = stack.pop();result.add(cur.val);cur = cur.right;}}return result;}
}

二叉树的后序遍历

后序遍历

题目描述

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。

提示:

树中节点的数目在范围 [0, 100] 内
-100 <= Node.val <= 100

思路

后续遍历的遍历顺序是左右根,前序遍历的遍历顺序是根左右,我们发现我们只需要调整一下左右孩子的进栈顺序,然后再反转一下,就可以得到后序遍历

代码

class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> list=new ArrayList();Stack<TreeNode> stack=new Stack();if(root==null){return list;}stack.push(root);while(!stack.isEmpty()){TreeNode node=stack.pop();list.add(node.val);if(node.left!=null){stack.push(node.left);}if(node.right!=null){stack.push(node.right);}}//反转Collections.reverse(list);return list;}
}

二叉树的层序遍历

层序遍历

题目描述

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

前提知识

在解决这道题目之前,我们应该先了解什么是层序遍历
层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。
队列先进先出,符合一层一层遍历的逻辑,我们可以使用队列来实现层序遍历

public void levelOrderTraversal(Node root){if(root==null){return;}Queue<Node> queue=new LinkedList<>();queue.offer(root);while(!queue.isEmpty()){Node node=queue.poll();System.out.print(node.val+" ");if(node.left!=null) {queue.offer(node.left);}if(node.right!=null) {queue.offer(node.right);}}
}

代码

class Solution {public List<List<Integer>> levelOrder(TreeNode root) {if(root==null) {return new ArrayList<List<Integer>>();}List<List<Integer>> res = new ArrayList<List<Integer>>();Queue<TreeNode> queue = new LinkedList<TreeNode>();//将根节点放入队列中,然后不断遍历队列queue.add(root);while(queue.size()>0) {//获取当前队列的长度,这个长度相当于 当前这一层的节点个数int size = queue.size();ArrayList<Integer> tmp = new ArrayList<Integer>();//将队列中的元素都拿出来(也就是获取这一层的节点),放到临时list中//如果节点的左/右子树不为空,也放入队列中for(int i=0;i<size;++i) {TreeNode t = queue.poll();tmp.add(t.val);if(t.left!=null) {queue.offer(t.left);}if(t.right!=null) {queue.offer(t.right);}}//将临时list加入最终返回结果中res.add(tmp);}return res;}
}

数据结构:二叉树的非递归遍历相关推荐

  1. 数据结构-二叉树的非递归遍历

    前面的章节我们实现了二叉树最基本的遍历方式:递归遍历,代码是如此的简洁:辣么我们为什么还要去学习二叉树的非递归遍历方式呢?众所周知,递归优点是将可以将复杂的问题简单化即大问题拆分成一个个小问题,那么它 ...

  2. 二叉树的非递归遍历(c/c++)

    由于递归算法相对于非递归算法来说效率通常都会更低,递归算法会有更多的资源需要压栈和出栈操作(不仅仅是参数,还有函数地址等)由于编译器对附加的一些栈保护机制会导致递归执行的更加低效,使用循环代替递归算法 ...

  3. c语言以顺序结构存储的二叉树的非递归遍历,C语言二叉树的非递归遍历实例分析...

    本文以实例形式讲述了C语言实现二叉树的非递归遍历方法.是数据结构与算法设计中常用的技巧.分享给大家供大家参考.具体方法如下: 先序遍历: void preOrder(Node *p) //非递归 { ...

  4. 树:二叉树的非递归遍历算法

    二叉树的递归遍历 二叉树的递归遍历算法,写法很简单,比如说前序遍历树,如下: //前序遍历 void PreOrderTraverse(BiTree tree) {if (NULL != tree){ ...

  5. 刷题:二叉树的非递归遍历方式

    二叉树的非递归的遍历方式 上篇博客记录了二叉树的递归遍历方式以及根据二叉树的遍历结果还原二叉树的内容. 本篇博客记录二叉树的非递归的遍历方式. 二叉树的非递归遍历需要借助栈来实现,而且三种遍历的方式的 ...

  6. 二叉树的非递归遍历(统一的模板)

    二叉树的非递归遍历 前言 树的存储结构 先序遍历 先序的递归遍历 先序的非递归遍历 中序遍历 中序的递归遍历 中序遍历的非递归算法 后序遍历 后序的递归遍历 后序的非递归遍历 层次遍历 层次遍历获得每 ...

  7. 6-9 二叉树的非递归遍历 (20 分)

    ** 6-9 二叉树的非递归遍历 (20 分) ** 本题要求用非递归的方法实现对给定二叉树的 3 种遍历. 函数接口定义: void InorderTraversal( BinTree BT ); ...

  8. C/C++ 二叉树的非递归遍历(前序、中序、后序非递归遍历)

     二叉树的非递归遍历C/C++实现:   非递归先序遍历代码: void PreOrderTraversal (struct tree* root) { //非递归先序遍历struct tree* t ...

  9. C语言实现二叉树的非递归遍历

    C语言实现二叉树的非递归遍历: 代码解释: 非递归前序遍历:1> 首先建立一个二维指针,用来存储每个结点的地址,定义栈顶指针top,初始值为-1,并将根结点存入栈中,top++:2> 进入 ...

  10. 二叉树的非递归遍历(C语言实现)

    上一篇讨论了二叉树的的递归遍历,这一次讨论二叉树的三种非递归遍历 二叉树的非递归遍历采用栈实现,首先给出二叉树和栈的定义 #define STACK_INIT_SIZE 100 #define STA ...

最新文章

  1. Anaconda安装,jupyter notebook 使用说明
  2. PM你真的很忙吗?如何进行时间管理
  3. Android持久化存储(1)文件存储
  4. 源代码管理之SVN服务器搭建和使用
  5. 读取exchange邮件的未读数(转载)
  6. 徐昊:运用四色建模法进行领域分析
  7. html5移动web开发实战必读书记
  8. 显式Intent 和隐式 Intent 的区别
  9. 四十六 常用内建模块 itertools
  10. Listen 0.0.0.0:80 Listen [::0]:80
  11. JAVA购物商城系统毕业设计 开题报告
  12. Cubieboard安装系统
  13. 文科生的悲哀-斐波拉契数列
  14. [BZOJ1050] [HAOI2006] 旅行comf (Kruskal, LCT)
  15. react钩子_使用钩子在react中分页数据视图
  16. HCIP2--ISIS
  17. 第十一天-购物车订单系统的实现
  18. 【Java】子类列表和父类列表能否互相赋值与添加
  19. Digital Ocean 如何使用GitHub学生优惠码
  20. Linux中使用iptables记录网络访问日志

热门文章

  1. 学习残差神经网络(ResNet)
  2. 了解腾讯云云支付CPay特性及应用场景
  3. Mac 安装的虚拟机win10系统,设置拥有各自的桌面
  4. 图像检索--联合加权聚合深度卷积特征的图像检索方法
  5. fgo服务器维护检测脚本,fgo脚本工具游戏蜂窝简单实例
  6. Java Map排序
  7. 备战秋招之数电模电知识点
  8. KEIL5下载时提示“keil5 notarget connected”
  9. HpSocket HttpEasyClient 二次封装
  10. 2021年上半年软件设计师下午真题及答案解析