樹的周遊
以前序周遊為例
(1)先周遊樹根
(2)然後前序周遊左子樹
(3)最後前序周遊右子樹
對于這樣的一個二叉樹
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yNyIGMycDOxImM2ITNzYzXxIzMxcTMxIzLcBTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
前序周遊結果:ABDEGCF
周遊流程:
【1】首先周遊樹根,輸出A
【2】對A的左子樹進行前序周遊,怎麼前序周遊?對于B這個左子樹而言,首先周遊根節點,輸出B
【3】然後周遊子樹B的左子樹,得到D這個子樹,對D進行前序周遊,首先周遊樹根節點,輸出D
【4】然後周遊D的左子樹,不存在。那就周遊D的右子樹,不存在。此時B的左子樹D周遊完成
【5】周遊B的右子樹E,則前序周遊E,首先周遊樹根結點,輸出E
【6】周遊E的左子樹,得到子樹G,對于子樹G,前序周遊G,得到樹根節點G,輸出G,此時G周遊完成
【7】此時A的左子樹周遊完成,現在開始周遊A的右子樹C,前序周遊C,得到樹根結點,輸出C
【8】周遊C的左子樹,不存在,則周遊其右子樹,得到子樹F,前序周遊F,得到樹根結點F,輸出F
同理,中序周遊結果:DBGEACF
後序周遊結果:DGEBFCA
樹的周遊 代碼示範
節點類
public class TreeNode {
private final char value;
private TreeNode left;
private TreeNode right;
public TreeNode(char value) {
this.value = value;
this.left = null;
this.right = null;
}
public char getValue() {
return value;
}
public TreeNode getLeft() {
return left;
}
public void setLeft(TreeNode left) {
this.left = left;
}
public TreeNode getRight() {
return right;
}
public void setRight(TreeNode right) {
this.right = right;
}
}
人肉構造一棵樹,也就是圖中的那棵樹
public class TreeCreator {
public TreeNode createTree() {
TreeNode root = new TreeNode('A');
root.setLeft(new TreeNode('B'));
root.setRight(new TreeNode('C'));
root.getLeft().setLeft(new TreeNode('D'));
root.getLeft().setRight(new TreeNode('E'));
root.getLeft().getRight().setLeft(new TreeNode('G'));
root.getRight().setRight(new TreeNode('F'));
return root;
}
}
前序周遊、中序周遊、後序周遊代碼
public class Main {
//前序周遊
public void preOrder(TreeNode root) {
if (root == null) {
return;
}
System.out.print(root.getValue());
preOrder(root.getLeft());
preOrder(root.getRight());
}
//中序周遊
public void inOrder(TreeNode root) {
if (root == null) {
return;
}
inOrder(root.getLeft());
System.out.print(root.getValue());
inOrder(root.getRight());
}
//後序周遊
public void postOrder(TreeNode root) {
if (root == null) {
return;
}
postOrder(root.getLeft());
postOrder(root.getRight());
System.out.print(root.getValue());
}
public static void main(String[] args) {
TreeCreator creator = new TreeCreator();
Main main = new Main();
System.out.print("前序周遊:");
main.preOrder(creator.createTree());
System.out.println();
System.out.print("中序周遊:");
main.inOrder(creator.createTree());
System.out.println();
System.out.print("後序周遊:");
main.postOrder(creator.createTree());
}
}