一 广度优先遍历(BFS)

  1. //广度优先遍历二叉树,借助队列,queue
  2. public static void bfs(TreeNode root){
  3. Queue<TreeNode> queue = new LinkedList<TreeNode>(); //队列需要使用linkedlist来初始化
  4. if(root == null)
  5. return;
  6. queue.add(root);
  7. while(!queue.isEmpty()){
  8. TreeNode node = queue.poll();
  9. System.out.print(node.val + " ");
  10. if(node.left != null)
  11. queue.add(node.left);
  12. if(node.right != null)
  13. queue.add(node.right);
  14. }
  15. }

二 深度优先遍历(DFS)

  1. //深度优先遍历二叉树,借助堆栈,stack
  2. public static void dfs(TreeNode root){
  3. Stack<TreeNode> stack = new Stack<TreeNode>(); //借助stack
  4. if(root == null)
  5. return;
  6. stack.push(root);
  7. while(!stack.isEmpty()){ //若栈非空
  8. TreeNode node = stack.pop();
  9. System.out.print(node.val + " ");
  10. if(node.right != null) //先将右孩子结点压入堆栈
  11. stack.push(node.right);
  12. if(node.left != null) //然后将左孩子结点压入堆栈
  13. stack.push(node.left);
  14. }
  15. }

三、先序遍历非递归(preOrder)

  1. /**
  2. * 迭代(即深度优先遍历二叉树)
  3. * 先序遍历二叉树
  4. * @param root
  5. * @return
  6. */
  7. public static List<Object> preorderTraversal(TreeNode root) {
  8. List<Object> list = new ArrayList<Object>();
  9. if(root == null)
  10. return list;
  11. Stack<TreeNode> stack = new Stack<TreeNode>();
  12. stack.add(root);
  13. while(!stack.isEmpty()){
  14. TreeNode node = stack.pop();
  15. list.add(node.val);
  16. if(node.right != null) //先压入右子树
  17. stack.push(node.right);
  18. if(node.left != null) //再压入左子树
  19. stack.push(node.left);
  20. }
  21. System.out.println(list);
  22. return list;
  23. }

四、中序遍历非递归(inOrder)

  1. /**
  2. * 迭代
  3. * 中序遍历二叉树
  4. * @param root
  5. * @return
  6. */
  7. public static List<Object> inorderTraversal(TreeNode root) {
  8. List<Object> list = new ArrayList<Object>();
  9. if(root == null)
  10. return list;
  11. Stack<TreeNode> s = new Stack<TreeNode>();
  12. TreeNode p = root;
  13. while(p != null || !s.isEmpty()){
  14. while(p != null){
  15. s.push(p);
  16. p = p.left;
  17. }
  18. p = s.pop();
  19. list.add(p.val);
  20. p = p.right;
  21. }
  22. System.out.println(list);
  23. return list;
  24. }

五、后序遍历非递归(postOrder)

  1. //后序非递归遍历二叉树
  2. public static List<Object> postOrder(TreeNode root){
  3. List<Object> list = new ArrayList<Object>();
  4. if(root == null)
  5. return list;
  6. Stack<TreeNode> stack = new Stack<TreeNode>();
  7. TreeNode node = root, prev = root; //pre记录上一个已经输出的结点
  8. while (node != null || stack.size() > 0) {
  9. while (node != null) {
  10. stack.push(node);
  11. node = node.left;
  12. }
  13. TreeNode temp = stack.peek().right; //在出栈之前,先判断栈顶元素的右孩子结点
  14. if (temp == null || temp == prev) { //当前节点无右子树或右子树已经输出
  15. node = stack.pop();
  16. list.add(node.val);
  17. prev = node; //记录上一个已输出结点
  18. node = null;
  19. } else {
  20. node = temp; //处理右子树
  21. }
  22. }
  23. System.out.println(list);
  24. return list;
  25. }

BFS、DFS、先序、中序、后序遍历的非递归算法(java)的更多相关文章

  1. 前序 中序 后序 遍历 递归 非递归算法 java实现

    前序遍历 非递归 public void preordernorec(TreeNode root){ //System.out.println("先序遍历(非递归):"); //用 ...

  2. 已知树的前序、中序,求后序的java实现&已知树的后序、中序,求前序的java实现

    public class Order { int findPosInInOrder(String str,String in,int position){ char c = str.charAt(po ...

  3. DS Tree 已知先序、中序 => 建树 => 求后序

    参考:二叉树--前序和中序得到后序 思路历程: 在最初敲的时候,经常会弄混preorder和midorder的元素位置.大体的思路就是在preorder中找到根节点(根节点在序列的左边),然后在mid ...

  4. TZOJ 3209 后序遍历(已知中序前序求后序)

    描述 在数据结构中,遍历是二叉树最重要的操作之一.所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问. 这里给出三种遍历算法. 1.中序遍历的递归算法定义:  ...

  5. [Java]算术表达式求值之二(中序表达式转后序表达式方案,支持小数)

    Inlet类,入口类,这个类的主要用途是验证用户输入的算术表达式: package com.hy; import java.io.BufferedReader; import java.io.IOEx ...

  6. [Java]算术表达式求值之一(中序表达式转后序表达式方案)

    第二版请见:https://www.cnblogs.com/xiandedanteng/p/11451359.html 入口类,这个类的主要用途是粗筛用户输入的算术表达式: package com.h ...

  7. HDU 1710Binary Tree Traversals(已知前序中序,求后序的二叉树遍历)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1710 解题思路:可以由先序和中序的性质得到 : 先序的第一个借点肯定是当前子树的根结点, 那么在 中序 ...

  8. 分别求二叉树前、中、后序的第k个节点

    一.求二叉树的前序遍历中的第k个节点 //求先序遍历中的第k个节点的值 ; elemType preNode(BTNode *root,int k){ if(root==NULL) return ' ...

  9. HDU 1710 (二叉树的前序和中序,求后序)

    题目链接 题目大意: 输入二叉树的前序.中序遍历,请输出它的后序遍历 #include <stdio.h> #include <string.h> ; // 长度为n s1 前 ...

随机推荐

  1. CodeForces 430A Points and Segments (easy)(构造)题解

    题意:之前愣是没看懂题意...就是给你n个点的坐标xi,然后还规定了Li,Ri,要求给每个点染色,每一组L,R内的点红色和黑色的个数不能相差大于1个,问你能不能染成功,不能输出-1,能就按照输入的顺序 ...

  2. hihoCoder week6 01背包

    01背包 题目链接 https://hihocoder.com/contest/hiho6/problem/1 #include <bits/stdc++.h> using namespa ...

  3. oracle 之 统计函数、子查询、操作符

    统计函数 COUNT():查询表中的数据记录 AVG():求出平均值 SUM():求和 MAX():求出最大值 MIN():Q求出最小值 子查询   [单行多列] select * from a wh ...

  4. oracle单行函数 之 字符函数

    Upper(字符串 / 列):将输入的字符串变成大写 Lower(字符串 / 列):将输入的字符串变成小写 Initcap(字符串 / 列):开头首字母大写 Length(字符串 / 列):字符串长度 ...

  5. Linux 压缩、解压命令使用

    tar在Linux上是常用的打包.压缩.加压缩工具,他的参数很多,这里仅仅列举常用的压缩与解压缩参数 参数: -c :create 建立压缩档案的参数:(个人理解也就是打包) -x : 解压缩压缩档案 ...

  6. Levenshtein Distance,判断字符串的相似性

    private int LevenshteinDistance(string s1,string s2,int maxValue) { if (s1 == null|| s1.Length == 0) ...

  7. Git回顾

    抄自廖雪峰的官方网站 完整图文请访问https://github.com/Mrlution/study/tree/master/git 关于repository 我认为repository是一个存放代 ...

  8. 一.移动app测试与质量保证

    1.典型的互联网产品的研发流程,及其核心做法.这里并不是简单的套用敏捷等流程方法,而是经过时间摸索和不断调整,找到最适合自己产品的流程做法,这是质量实践质量保证的基础. 2.系统功能测试实践.包涵需求 ...

  9. wxss与rpx

    WXSS(WeiXin Style Sheets)是一套样式语言,用于描述 WXML 的组件样式. WXSS 用来决定 WXML 的组件应该怎么显示. 为了适应广大的前端开发者,WXSS 具有 CSS ...

  10. art-template

    art-template 输出 标准语法 {{value}} {{data.key}} {{data['key']}} {{a ? b : c}} {{a || b}} {{a + b}} 原始语法 ...