首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 實作二叉樹資料結構:建立、先序、中序、後序與層次遍歷完整代碼

     編輯:Java 相關知識

節點定義與樹建立

public class BinaryTree<E> {
    static class Node<E> {
        E data; Node<E> left, right;
        Node(E data) { this.data = data; }
    }
    private Node<E> root;

    // 由陣列 (層序順序) 建立完全二叉樹
    @SuppressWarnings("unchecked")
    public void createFromArray(E[] array) {
        List<Node<E>> nodes = new ArrayList<>();
        for (E val : array) nodes.add(new Node<>(val));
        root = nodes.get(0);
        for (int i = 0; i < nodes.size() / 2; i++) {
            nodes.get(i).left = nodes.get(i * 2 + 1);
            if (i * 2 + 2 < nodes.size())
                nodes.get(i).right = nodes.get(i * 2 + 2);
        }
    }

    // 先序遍歷 (根-左-右)
    public void preOrder(Node<E> node) {
        if (node == null) return;
        System.out.println(node.data);
        preOrder(node.left);
        preOrder(node.right);
    }

    // 中序遍歷 (左-根-右)
    public void inOrder(Node<E> node) {
        if (node == null) return;
        inOrder(node.left);
        System.out.println(node.data);
        inOrder(node.right);
    }

    // 後序遍歷 (左-右-根)
    public void postOrder(Node<E> node) {
        if (node == null) return;
        postOrder(node.left);
        postOrder(node.right);
        System.out.println(node.data);
    }

    // 層次遍歷 (需 Queue)
    public void levelOrder() {
        if (root == null) return;
        Queue<Node<E>> q = new LinkedList<>();
        q.offer(root);
        while (!q.isEmpty()) {
            Node<E> cur = q.poll();
            System.out.println(cur.data);
            if (cur.left != null) q.offer(cur.left);
            if (cur.right != null) q.offer(cur.right);
        }
    }

    public Node<E> getRoot() { return root; }

    public static void main(String[] args) {
        BinaryTree<Integer> tree = new BinaryTree<>();
        Integer[] arr = {1,2,3,4,5,6,7,8,9,10};
        tree.createFromArray(arr);
        System.out.println("後序遍歷結果:");
        tree.postOrder(tree.getRoot());
    }
}

遍歷順序圖解

對於陣列 {1,2,3,4,5,6,7} 建立的樹:

  • 先序:1 2 4 5 3 6 7
  • 中序:4 2 5 1 6 3 7
  • 後序:4 5 2 6 7 3 1
  • 層次:1 2 3 4 5 6 7

遞歸 vs 非遞歸

上述為遞歸實現,簡潔易懂。深度極大時可能棧溢出,可改用顯式棧模擬遞歸實現非遞歸遍歷。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved