二叉树遍历分为前序、中序、后序递归和非递归遍历、还有层序遍历。
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 }