先序遍歷就是按照 根節點 => 左子樹 => 右子樹 的順序訪問。
其實:
先序、中序、後序遍歷,主要是對根節點讀取順序而言的。
下面介紹下兩種具體的遍歷方法。
1、首先先定義一個樹節點類信息,如下:
package com.dz.demo.algorithm;
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
2、遞歸調用比較簡單,具體如下:
private static void preOrderRecursive(TreeNode root) {
if (root == null) return;
System.out.println(root.val);
preOrderRecursive(root.left);
preOrderRecursive(root.right);
}
3、非遞歸的方法主要是藉助棧結構來完成:
private static void preOrderUnRecursive(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.empty()) {
TreeNode temp = stack.pop();
if (temp == null) continue;
System.out.println(temp.val);
// 明確棧的進出順序,先進後出,所以先序遍歷,先push右子樹
stack.push(temp.right);
stack.push(temp.left);
}
}
4、測試,如下二叉樹:
public static void main(String[] args) {
TreeNode root = new TreeNode(5);
TreeNode cLeft1 = new TreeNode(3);
TreeNode cRight1 = new TreeNode(7);
TreeNode clLeft2 = new TreeNode(2);
TreeNode clRight2 = new TreeNode(4);
TreeNode crLeft2 = new TreeNode(6);
TreeNode crRight2 = new TreeNode(8);
root.left = cLeft1;
root.right = cRight1;
cLeft1.left = clLeft2;
cLeft1.right = clRight2;
cRight1.left = crLeft2;
cRight1.right = crRight2;
// preOrderRecursive(root);
preOrderUnRecursive(root);
}
5、結果如下:
Connected to the target VM, address: '127.0.0.1:55176', transport: 'socket'
5
3
2
4
7
6
8
Disconnected from the target VM, address: '127.0.0.1:55176', transport: 'socket'
Process finished with exit code 0