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} 建立的樹:
上述為遞歸實現,簡潔易懂。深度極大時可能棧溢出,可改用顯式棧模擬遞歸實現非遞歸遍歷。