二叉樹的遍歷方式
阿新 • • 發佈:2021-01-17
技術標籤:演算法
二叉樹的遍歷方式分為兩種,一種是廣度優先遍歷,包含了層序遍歷;另一種則是深度優先遍歷,包含了前序遍歷、中序遍歷和後序遍歷。下面對四種具體的遍歷進行說明:
- 層序遍歷:從上到下、從左到右地列出每一個結點
- 前序遍歷:按照 根結點 -> 左子樹 -> 右子樹
- 中序遍歷:按照 左子樹 -> 根結點 -> 右子樹
- 後序遍歷:按照 左子樹 -> 右子樹 -> 根結點
舉個例子:
各種遍歷的結果為:
- 層序遍歷:4,2,6,1,3,5
- 前序遍歷:4,2,1,3,6,5
- 中序遍歷:1,2,3,4,5,6
- 後序遍歷:1,3,2,5,6,4
一般來說樹的層序遍歷可以借用佇列迴圈遍歷來實現,深度遍歷通過遞迴來實現,也可以借用棧來實現。
層序遍歷模板
public void levelTraverse(TreeNode root) {
if (root == null) return;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
System.out.print(node.val);
if (node.left != null) queue. add(node.left);
if (node.right != null) queue.add(node.right);
}
}
前序遍歷模板
前序遍歷:根結點 -> 左子樹 -> 右子樹
// 遞迴方式
public void preorderTraversal(TreeNode root) {
if (root == null) return;
System.out.print(root.val);// 根結點
preorderTraversal(root.left);// 左子樹
preorderTraversal(root. right);// 右子樹
}
// 非遞迴方式
public void preorderTraversal2(TreeNode root) {
if (root == null) return;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
System.out.print(node.val);
if (node.right != null) stack.push(node.right);
if (node.left != null) stack.push(node.left);
}
}
中序遍歷模板
中序遍歷:左子樹 -> 根結點 -> 右子樹
// 遞迴方式
public void middleOrderTraversal(TreeNode root) {
if (root == null) return;
middleOrderTraversal(root.left);
System.out.print(root.val);
middleOrderTraversal(root.right);
}
// 非遞迴方式
public void middleOrderTraversal2(TreeNode root) {
if (root == null) return;
Stack<TreeNode> stack = new Stack<>();
TreeNode node = root;
while (node != null || !stack.isEmpty()) {
if (node != null) {
stack.push(node);
node = node.left;
} else {
TreeNode t = stack.pop();
System.out.print(t.val);
node = t.right;
}
}
}
後序遍歷模板
後序遍歷:左子樹 -> 右子樹 -> 根結點
// 遞迴方式
public void postOrderTraversal(TreeNode root) {
if (root == null) return;
postOrderTraversal(root.left);
postOrderTraversal(root.right);
System.out.print(root.val);
}
// 非遞迴方式
public void postOrderTraversal2(TreeNode root) {
if (root == null) return;
Stack<TreeNode> stack = new Stack<>();
TreeNode node = root;
while (node != null || !stack.isEmpty()) {
if (node != null) {
stack.push(node);
node = node.left;
} else {
TreeNode t = stack.pop();
if (t.right != null) {
stack.push(t);
node = t.right;
t.right = null;
continue;
}
System.out.print(t.val);
}
}
}
更多演算法文章可以關注公眾號:小白菜程式設計