二叉树遍历-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 }

 

posted @ 2017-04-06 21:16  码农皮邱  阅读(22194)  评论(0编辑  收藏  举报