博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA下实现二叉树的先序、中序、后序、层序遍历(递归和循环)
阅读量:6093 次
发布时间:2019-06-20

本文共 3873 字,大约阅读时间需要 12 分钟。

import java.util.HashMap;  import java.util.LinkedList;  import java.util.Map;  import java.util.Queue;  import java.util.Stack;    /**  *   * @author kerryfish  * JAVA实现二叉树的先序、中序、后序、层序遍历  * 递归和非递归版本  *  */    class Node{      public int value;      public Node left;      public Node right;      public Node(int v){          this.value=v;          this.left=null;          this.right=null;      }        }  class BinaryTreeTraversal {      /**      * @param root 树根节点      * 递归先序遍历      */      public static void preOrderRec(Node root){          if(root!=null){              System.out.println(root.value);              preOrderRec(root.left);              preOrderRec(root.right);          }      }      /**      * @param root 树根节点      * 递归中序遍历      */      public static void inOrderRec(Node root){          if(root!=null){              preOrderRec(root.left);              System.out.println(root.value);              preOrderRec(root.right);          }      }      /**      * @param root 树根节点      * 递归后序遍历      */      public static void postOrderRec(Node root){          if(root!=null){              preOrderRec(root.left);              preOrderRec(root.right);              System.out.println(root.value);          }      }      /**      *       * @param root 树根节点      * 利用栈实现循环先序遍历二叉树      * 这种实现类似于图的深度优先遍历(DFS)      * 维护一个栈,将根节点入栈,然后只要栈不为空,出栈并访问,接着依次将访问节点的右节点、左节点入栈。      * 这种方式应该是对先序遍历的一种特殊实现(看上去简单明了),但是不具备很好的扩展性,在中序和后序方式中不适用      */      public static void preOrderStack_1(Node root){          if(root==null)return;          Stack
s=new Stack
(); s.push(root); while(!s.isEmpty()){ Node temp=s.pop(); System.out.println(temp.value); if(temp.right!=null) s.push(temp.right); if(temp.left!=null) s.push(temp.left); } } /** * * @param root 树的根节点 * 利用栈模拟递归过程实现循环先序遍历二叉树 * 这种方式具备扩展性,它模拟递归的过程,将左子树点不断的压入栈,直到null,然后处理栈顶节点的右子树 */ public static void preOrderStack_2(Node root){ if(root==null)return; Stack
s=new Stack
(); while(root!=null||!s.isEmpty()){ while(root!=null){ System.out.println(root.value); s.push(root);//先访问再入栈 root=root.left; } root=s.pop(); root=root.right;//如果是null,出栈并处理右子树 } } /** * * @param root 树根节点 * 利用栈模拟递归过程实现循环中序遍历二叉树 * 思想和上面的preOrderStack_2相同,只是访问的时间是在左子树都处理完直到null的时候出栈并访问。 */ public static void inOrderStack(Node root){ if(root==null)return; Stack
s=new Stack
(); while(root!=null||!s.isEmpty()){ while(root!=null){ s.push(root);//先访问再入栈 root=root.left; } root=s.pop(); System.out.println(root.value); root=root.right;//如果是null,出栈并处理右子树 } } /** * * @param root 树根节点 * 后序遍历不同于先序和中序,它是要先处理完左右子树,然后再处理根(回溯),所以需要一个记录哪些节点已经被访问的结构(可以在树结构里面加一个标记),这里可以用map实现 */ public static void postOrderStack(Node root){ if(root==null)return; Stack
s=new Stack
(); Map
map=new HashMap
(); s.push(root); while(!s.isEmpty()){ Node temp=s.peek(); if(temp.left!=null&&!map.containsKey(temp.left)){ temp=temp.left; while(temp!=null){ if(map.containsKey(temp))break; else s.push(temp); temp=temp.left; } continue; } if(temp.right!=null&&!map.containsKey(temp.right)){ s.push(temp.right); continue; } Node t=s.pop(); map.put(t,true); System.out.println(t.value); } } /** * * @param root 树根节点 * 层序遍历二叉树,用队列实现,先将根节点入队列,只要队列不为空,然后出队列,并访问,接着讲访问节点的左右子树依次入队列 */ public static void levelTravel(Node root){ if(root==null)return; Queue
q=new LinkedList
(); q.add(root); while(!q.isEmpty()){ Node temp = q.poll(); System.out.println(temp.value); if(temp.left!=null)q.add(temp.left); if(temp.right!=null)q.add(temp.right); } } }

  

转载地址:http://uwwza.baihongyu.com/

你可能感兴趣的文章
Spring学习(16)--- 基于Java类的配置Bean 之 基于泛型的自动装配(spring4新增)...
查看>>
实验八 sqlite数据库操作
查看>>
四种简单的排序算法(转)
查看>>
Quartz2D之着色器使用初步
查看>>
多线程条件
查看>>
Git [remote rejected] xxxx->xxxx <no such ref>修复了推送分支的错误
查看>>
Porter/Duff,图片加遮罩setColorFilter
查看>>
黄聪:VMware安装Ubuntu10.10【图解】转
查看>>
Centos 6.x 升级openssh版本
查看>>
公式推♂倒题
查看>>
vue实现点击展开,点击收起
查看>>
如何使frame能居中显示
查看>>
第k小数
查看>>
构建之法阅读笔记三
查看>>
Python/PHP 远程文件/图片 下载
查看>>
【原创】一文彻底搞懂安卓WebView白名单校验
查看>>
写给对前途迷茫的朋友:五句话定会改变你的人生
查看>>
并行程序设计学习心得1——并行计算机存储
查看>>
mysql练习题40道
查看>>
JAVA入门到精通-第86讲-半双工/全双工
查看>>