CodeWalk

二叉树遍历与二叉搜索树的Java实现

作者:古法程序员 · 2026-05-30 12:55

请用Java实现**二叉树(Binary Tree)的三种深度优先遍历(前序/中序/后序,递归和非递归)和二叉搜索树(BST)**的插入、查找、删除操作(重点说明删除时三种情况的处理)。解释二叉树和BST的应用场景。

回答

古法程序员

二叉树遍历

class TreeNode {
    int val;
    TreeNode left, right;
    TreeNode(int val) { this.val = val; }
}

// 前序遍历:根 → 左 → 右
void preorder(TreeNode node) {
    if (node == null) return;
    visit(node);
    preorder(node.left);
    preorder(node.right);
}

// 前序遍历(非递归)
void preorderIterative(TreeNode root) {
    Stack<TreeNode> stack = new Stack<>();
    stack.push(root);
    while (!stack.isEmpty()) {
        TreeNode node = stack.pop();
        if (node == null) continue;
        visit(node);
        stack.push(node.right);  // 先右后左(栈LIFO)
        stack.push(node.left);
    }
}

// 中序遍历:左 → 根 → 右
void inorderIterative(TreeNode root) {
    Stack<TreeNode> stack = new Stack<>();
    TreeNode cur = root;
    while (cur != null || !stack.isEmpty()) {
        while (cur != null) {       // 一路向左
            stack.push(cur);
            cur = cur.left;
        }
        cur = stack.pop();
        visit(cur);
        cur = cur.right;
    }
}

// 后序遍历:左 → 右 → 根
void postorderIterative(TreeNode root) {
    Stack<TreeNode> stack = new Stack<>();
    TreeNode lastVisited = null, cur = root;
    while (cur != null || !stack.isEmpty()) {
        while (cur != null) {
            stack.push(cur);
            cur = cur.left;
        }
        cur = stack.peek();
        if (cur.right == null || cur.right == lastVisited) {
            visit(stack.pop());
            lastVisited = cur;
            cur = null;
        } else {
            cur = cur.right;
        }
    }
}

二叉搜索树操作

class BST {
    TreeNode root;
    
    TreeNode search(int val) {
        TreeNode cur = root;
        while (cur != null && cur.val != val) {
            cur = val < cur.val ? cur.left : cur.right;
        }
        return cur;
    }
    
    TreeNode insert(TreeNode node, int val) {
        if (node == null) return new TreeNode(val);
        if (val < node.val) node.left = insert(node.left, val);
        else if (val > node.val) node.right = insert(node.right, val);
        return node;
    }
    
    TreeNode delete(TreeNode node, int val) {
        if (node == null) return null;
        
        if (val < node.val) {
            node.left = delete(node.left, val);
        } else if (val > node.val) {
            node.right = delete(node.right, val);
        } else {
            // 情况1:叶子节点
            if (node.left == null && node.right == null) return null;
            // 情况2:只有一个子节点
            if (node.left == null) return node.right;
            if (node.right == null) return node.left;
            // 情况3:有两个子节点 → 找右子树最小值(或左子树最大值)
            TreeNode min = findMin(node.right);
            node.val = min.val;
            node.right = delete(node.right, min.val);
        }
        return node;
    }
}

应用场景

  • 二叉树:表达式树、Huffman编码树、决策树
  • BST:快速查找/插入/删除(平均O(log n),最坏O(n))
  • 自平衡BST(AVL/红黑树):TreeMap/TreeSet/数据库索引实现