1. 程式人生 > 其它 >二叉樹的遍歷方式

二叉樹的遍歷方式

技術標籤:演算法

二叉樹的遍歷方式分為兩種,一種是廣度優先遍歷,包含了層序遍歷;另一種則是深度優先遍歷,包含了前序遍歷、中序遍歷和後序遍歷。下面對四種具體的遍歷進行說明:

  • 層序遍歷:從上到下、從左到右地列出每一個結點
  • 前序遍歷:按照 根結點 -> 左子樹 -> 右子樹
  • 中序遍歷:按照 左子樹 -> 根結點 -> 右子樹
  • 後序遍歷:按照 左子樹 -> 右子樹 -> 根結點

舉個例子:

各種遍歷的結果為:

  • 層序遍歷: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);
        }
    }
}

更多演算法文章可以關注公眾號:小白菜程式設計
在這裡插入圖片描述