1. 二叉树基础概念与Java实现
二叉树是数据结构中最基础也是最重要的非线性结构之一,广泛应用于算法设计、数据库索引、文件系统等领域。作为Java开发者,深入理解二叉树不仅能帮助我们解决实际编程问题,也是应对技术面试的必备技能。
在Java中,二叉树通常通过节点(Node)类来实现,每个节点包含数据域和左右子节点引用。这种递归定义的结构天然适合处理层级关系数据,比如组织架构、决策树等场景。与线性结构相比,二叉树在查找、插入等操作上往往能提供更好的时间复杂度。
提示:虽然Java标准库没有直接提供二叉树实现,但TreeMap和TreeSet底层都是基于红黑树(一种自平衡二叉查找树)实现的,理解二叉树原理有助于更好地使用这些集合类。
1.1 二叉树基本特性
二叉树具有以下几个关键特性:
- 每个节点最多有两个子节点(左子节点和右子节点)
- 左子树和右子树是有顺序的,次序不能任意颠倒
- 第i层最多有2^(i-1)个节点
- 深度为k的二叉树最多有2^k - 1个节点
java复制// 基础二叉树节点定义
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
1.2 二叉树常见类型
根据节点排列方式的不同,二叉树主要分为以下几种类型:
- 满二叉树:所有非叶子节点都有两个子节点,且所有叶子节点都在同一层
- 完全二叉树:除最后一层外,其他层节点数都达到最大值,最后一层节点都集中在左侧
- 二叉搜索树(BST):左子树所有节点值小于根节点,右子树所有节点值大于根节点
- 平衡二叉树(AVL):任何节点的左右子树高度差不超过1
- 红黑树:一种自平衡二叉查找树,Java的TreeMap底层实现
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 二叉树的遍历方式
二叉树的遍历是面试中最常考察的内容之一,主要分为深度优先遍历(DFS)和广度优先遍历(BFS)两大类。
2.1 深度优先遍历(DFS)
深度优先遍历又分为三种经典方式:
- 前序遍历(Pre-order):根节点 → 左子树 → 右子树
- 中序遍历(In-order):左子树 → 根节点 → 右子树
- 后序遍历(Post-order):左子树 → 右子树 → 根节点
java复制// 递归实现前序遍历
public void preOrder(TreeNode root) {
if (root == null) return;
System.out.print(root.val + " "); // 访问根节点
preOrder(root.left); // 遍历左子树
preOrder(root.right); // 遍历右子树
}
// 迭代实现中序遍历
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode curr = root;
while (curr != null || !stack.isEmpty()) {
while (curr != null) {
stack.push(curr);
curr = curr.left;
}
curr = stack.pop();
res.add(curr.val);
curr = curr.right;
}
return res;
}
2.2 广度优先遍历(BFS)
广度优先遍历又称层次遍历,通常使用队列实现:
java复制public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if (root == null) return res;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
int levelSize = queue.size();
List<Integer> currentLevel = new ArrayList<>();
for (int i = 0; i < levelSize; i++) {
TreeNode node = queue.poll();
currentLevel.add(node.val);
