二叉树遍历-JAVA实现

二叉树遍历分为前序、中序、后序递归和非递归遍历、还有层序遍历。

 1 //二叉树节点
 2 public class BinaryTreeNode {
 3     private int data;
 4     private BinaryTreeNode left;
 5     private BinaryTreeNode right;
 6
 7     public BinaryTreeNode() {}
 8
 9     public BinaryTreeNode(int data, BinaryTreeNode left, BinaryTreeNode right) {
10         super();
11         this.data = data;
12         this.left = left;
13         this.right = right;
14     }
15
16     public int getData() {
17         return data;
18     }
19
20     public void setData(int data) {
21         this.data = data;
22     }
23
24     public BinaryTreeNode getLeft() {
25         return left;
26     }
27
28     public void setLeft(BinaryTreeNode left) {
29         this.left = left;
30     }
31
32     public BinaryTreeNode getRight() {
33         return right;
34     }
35
36     public void setRight(BinaryTreeNode right) {
37         this.right = right;
38     }
39 }
  1 import com.ccut.aaron.stack.LinkedStack;
  2
  3 public class BinaryTree {
  4     //前序遍历递归的方式
  5     public void preOrder(BinaryTreeNode root){
  6         if(null!=root){
  7             System.out.print(root.getData()+"\t");
  8             preOrder(root.getLeft());
  9             preOrder(root.getRight());
 10         }
 11     }
 12
 13     //前序遍历非递归的方式
 14     public void preOrderNonRecursive(BinaryTreeNode root){
 15         Stack<BinaryTreeNode> stack=new Stack<BinaryTreeNode>();
 16         while(true){
 17             while(root!=null){
 18                 System.out.print(root.getData()+"\t");
 19                 stack.push(root);
 20                 root=root.getLeft();
 21             }
 22             if(stack.isEmpty()) break;
 23             root=stack.pop();
 24             root=root.getRight();
 25         }
 26     }
 27
 28     //中序遍历采用递归的方式
 29     public void inOrder(BinaryTreeNode root){
 30         if(null!=root){
 31             inOrder(root.getLeft());
 32             System.out.print(root.getData()+"\t");
 33             inOrder(root.getRight());
 34         }
 35     }
 36
 37     //中序遍历采用非递归的方式
 38     public void inOrderNonRecursive(BinaryTreeNode root){
 39         Stack<BinaryTreeNode> stack=new Stack<BinaryTreeNode>();
 40         while(true){
 41             while(root!=null){
 42                 stack.push(root);
 43                 root=root.getLeft();
 44             }
 45             if(stack.isEmpty())break;
 46             root=stack.pop();
 47             System.out.print(root.getData()+"\t");
 48             root=root.getRight();
 49         }
 50     }
 51
 52     //后序遍历采用递归的方式
 53     public void postOrder(BinaryTreeNode root){
 54         if(root!=null){
 55             postOrder(root.getLeft());
 56             postOrder(root.getRight());
 57             System.out.print(root.getData()+"\t");
 58         }
 59     }
 60
 61     //后序遍历采用非递归的方式
 62     public void postOrderNonRecursive(BinaryTreeNode root){
 63         Stack<BinaryTreeNode> stack=new Stack<BinaryTreeNode>();
 64         while(true){
 65             if(root!=null){
 66                 stack.push(root);
 67                 root=root.getLeft();
 68             }else{
 69                 if(stack.isEmpty()) return;
 70
 71                 if(null==stack.lastElement().getRight()){
 72                     root=stack.pop();
 73                     System.out.print(root.getData()+"\t");
 74                     while(root==stack.lastElement().getRight()){
 75                         System.out.print(stack.lastElement().getData()+"\t");
 76                         root=stack.pop();
 77                         if(stack.isEmpty()){
 78                             break;
 79                         }
 80                     }
 81                 }
 82
 83                 if(!stack.isEmpty())
 84                     root=stack.lastElement().getRight();
 85                 else
 86                     root=null;
 87             }
 88         }
 89     }
 90
 91     //层序遍历
 92     public void levelOrder(BinaryTreeNode root){
 93         BinaryTreeNode temp;
 94         Queue<BinaryTreeNode> queue=new LinkedList<BinaryTreeNode>();
 95         queue.offer(root);
 96         while(!queue.isEmpty()){
 97             temp=queue.poll();
 98             System.out.print(temp.getData()+"\t");
 99             if(null!=temp.getLeft())
100                 queue.offer(temp.getLeft());
101             if(null!=temp.getRight()){
102                 queue.offer(temp.getRight());
103             }
104         }
105     }
106
107     public static void main(String[] args) {
108         BinaryTreeNode node10=new BinaryTreeNode(10,null,null);
109         BinaryTreeNode node8=new BinaryTreeNode(8,null,null);
110         BinaryTreeNode node9=new BinaryTreeNode(9,null,node10);
111         BinaryTreeNode node4=new BinaryTreeNode(4,null,null);
112         BinaryTreeNode node5=new BinaryTreeNode(5,node8,node9);
113         BinaryTreeNode node6=new BinaryTreeNode(6,null,null);
114         BinaryTreeNode node7=new BinaryTreeNode(7,null,null);
115         BinaryTreeNode node2=new BinaryTreeNode(2,node4,node5);
116         BinaryTreeNode node3=new BinaryTreeNode(3,node6,node7);
117         BinaryTreeNode node1=new BinaryTreeNode(1,node2,node3);
118
119         BinaryTree tree=new BinaryTree();
120         //采用递归的方式进行遍历
121         System.out.println("-----前序遍历------");
122         tree.preOrder(node1);
123         System.out.println();
124         //采用非递归的方式遍历
125         tree.preOrderNonRecursive(node1);
126         System.out.println();
127
128
129         //采用递归的方式进行遍历
130         System.out.println("-----中序遍历------");
131         tree.inOrder(node1);
132         System.out.println();
133         //采用非递归的方式遍历
134         tree.inOrderNonRecursive(node1);
135         System.out.println();
136
137         //采用递归的方式进行遍历
138         System.out.println("-----后序遍历------");
139         tree.postOrder(node1);
140         System.out.println();
141         //采用非递归的方式遍历
142         tree.postOrderNonRecursive(node1);
143         System.out.println();
144
145         //采用递归的方式进行遍历
146         System.out.println("-----层序遍历------");
147         tree.levelOrder(node1);
148         System.out.println();
149     }
150 }
时间: 2024-10-15 09:52:53

二叉树遍历-JAVA实现的相关文章

二叉树遍历Java实现

[仅贴代码及测试结果] -------------------BinaryTree.java------------------------------ class Tree<E>{ E element; Tree<E> lChild; Tree<E> rChild; public Tree(E e){ element = e; } } public class BinaryTree { /** * 树形如下: * 1 * / * 2 3 * \ / * 4 5 6 *

java实现二叉树遍历

package com.tree.demo; public class BinaryTree { int data; // 根节点数据   BinaryTree left; // 左子树 BinaryTree right; // 右子树 public BinaryTree(int data) // 实例化二叉树类 { this.data = data; left = null; right = null; } public void insert(BinaryTree root, int dat

java数据结构之二叉树遍历的非递归实现

算法概述递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍历算法.非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似.对于中序遍历来说,非递归的算法比递归算法的效率要高的多.其中序遍历算法的实现的过程如下:(1).初始化栈,根结点进栈:(2).若栈非空,则栈顶结点的左孩子结点相继进栈,直到null(到叶子结点时)退栈:访问栈顶结点(执行visit操作)并使栈顶结点的右孩子结点进栈成为栈顶结点.(3).重复执行(2),

【数据结构】之二叉树的java实现

二叉树的定义: 二叉树是树形结构的一个重要类型.许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要. 二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的.分别称作这个根的左子树和右子树的二叉树组成. 这个定义是递归的.由于左.右子树也是二叉树, 因此子树也可为空树.下图中展现了五种不同基本形态的二叉树. 其中 (a) 为空树, (b

算法之二叉树遍历

[代码示例] package com.wcs.java; import java.util.ArrayList; import java.util.List; public class BinaryTree { class TreeNode { public String data; //数据 public TreeNode leftNode; //左子树 public TreeNode rightNode; //右子树 public TreeNode(String data, TreeNode

【数据结构与算法】二叉树的Java实现及特点总结

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 二叉树是一种非常重要的数据结构,它同时具有数组和链表各自的特点:它可以像数组一样快速查找,也可以像链表一样快速添加.但是他也有自己的缺点:删除操作复杂. 我们先介绍一些关于二叉树的概念名词. 二叉树:是每个结点最多有两个子树的有序树,在使用二叉树的时候,数据并不是随便插入到节点中的,一个节点的左子节点的关键值必须小于此节点,右子节点的关键值必须大于或者是等于此节点,所以又称二叉查找树.二叉排序树.二叉搜索

【数据结构】二叉树的Java实践

二叉树,是常用的树之一. 性质: 每个节点最多有2个节点(即度最大为2) 有左.右节点(或左.右子树)之分,且节点有顺序之分(即左.右不能随意调换) 下面对二叉树做最简单的Java实践. > 二叉树的Java实践 树节点 package com.nicchagil.btree; public class TreeNode { private Integer value; private TreeNode left; private TreeNode right; public TreeNode(

排序二叉树及其Java实现

定义 排序二叉树的定义也是递归定义的,需要满足: (1)若它的左子树不为空,则左子树上所有节点的值要均小于根节点的值: (2)若它的右子树不为空,则右子树上所有节点的值要均大于根节点的值: (3)左.右子树也分别是排序二叉树 如下图,对于排序二叉树,若按中序遍历就可以得到由小到大的有序序列. 创建 创建排序二叉树的步骤就是不断像排序二叉树中添加新节点(p)的过程: (1)以根节点(root)为当前节点(current)开始搜索: (2)用新节点p的值和current的值进行比较: (3)如果p.

二叉树的Java实现及特点总结

二叉树是一种非常重要的数据结构,它同时具有数组和链表各自的特点:它可以像数组一样快速查找,也可以像链表一样快速添加.但是他也有自己的缺点:删除操作复杂. 我们先介绍一些关于二叉树的概念名词. 二叉树:是每个结点最多有两个子树的有序树,在使用二叉树的时候,数据并不是随便插入到节点中的,一个节点的左子节点的关键值必须小于此节点,右子节点的关键值必须大于或者是等于此节点,所以又称二叉查找树.二叉排序树.二叉搜索树. 完全二叉树:若设二叉树的高度为h,除第 h 层外,其它各层 (1-h-1) 的结点数都