算法中的二叉树

12 阅读3分钟

二叉树的定义

二叉树(Binary Tree)是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树是算法和数据结构中非常重要的概念,广泛应用于搜索、排序、动态规划等场景。


二叉树的基本性质

  1. 节点:每个节点包含数据、左子节点和右子节点。

  2. 根节点:树的顶部节点,没有父节点。

  3. 叶子节点:没有子节点的节点。

  4. 深度:从根节点到当前节点的路径长度。

  5. 高度:从当前节点到叶子节点的最长路径长度。

  6. 满二叉树:每个节点都有 0 或 2 个子节点。

  7. 完全二叉树:除了最后一层,其他层都是满的,且最后一层节点从左到右排列。


二叉树的遍历方式

  1. 前序遍历(Pre-order) :根节点 → 左子树 → 右子树。

  2. 中序遍历(In-order) :左子树 → 根节点 → 右子树。

  3. 后序遍历(Post-order) :左子树 → 右子树 → 根节点。

  4. 层序遍历(Level-order) :按层次从上到下、从左到右遍历。


二叉树常见算法题

1. 二叉树的最大深度

题目:给定一个二叉树,找出其最大深度。
示例

输入:
    3
   / \
  9  20
    /  \
   15   7
输出:3

解法

function maxDepth(root) {
  if (!root) return 0;
  return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
}

2. 二叉树的最小深度

题目:给定一个二叉树,找出其最小深度。
示例

输入:
    3
   / \
  9  20
    /  \
   15   7
输出:2

解法

function minDepth(root) {
  if (!root) return 0;
  if (!root.left) return minDepth(root.right) + 1;
  if (!root.right) return minDepth(root.left) + 1;
  return Math.min(minDepth(root.left), minDepth(root.right)) + 1;
}

3. 判断二叉树是否对称

题目:给定一个二叉树,检查它是否是镜像对称的。
示例

输入:
    1
   / \
  2   2
 / \ / \
3  4 4  3
输出:true

解法

function isSymmetric(root) {
  if (!root) return true;
  return compare(root.left, root.right);
}

function compare(left, right) {
  if (!left && !right) return true;
  if (!left || !right) return false;
  return left.val === right.val && compare(left.left, right.right) && compare(left.right, right.left);
}

4. 二叉树的层序遍历

题目:给定一个二叉树,返回其节点值的层序遍历结果。
示例

输入:
    3
   / \
  9  20
    /  \
   15   7
输出:[[3], [9, 20], [15, 7]]

解法

function levelOrder(root) {
  if (!root) return [];
  const result = [];
  const queue = [root];
  while (queue.length) {
    const levelSize = queue.length;
    const currentLevel = [];
    for (let i = 0; i < levelSize; i++) {
      const node = queue.shift();
      currentLevel.push(node.val);
      if (node.left) queue.push(node.left);
      if (node.right) queue.push(node.right);
    }
    result.push(currentLevel);
  }
  return result;
}

5. 二叉树的前序遍历

题目:给定一个二叉树,返回其节点值的前序遍历结果。
示例

输入:
    1
     \
      2
     /
    3
输出:[1, 2, 3]

解法

function preorderTraversal(root) {
  const result = [];
  function traverse(node) {
    if (!node) return;
    result.push(node.val);
    traverse(node.left);
    traverse(node.right);
  }
  traverse(root);
  return result;
}

6. 二叉树的中序遍历

题目:给定一个二叉树,返回其节点值的中序遍历结果。
示例

输入:
    1
     \
      2
     /
    3
输出:[1, 3, 2]

解法

function inorderTraversal(root) {
  const result = [];
  function traverse(node) {
    if (!node) return;
    traverse(node.left);
    result.push(node.val);
    traverse(node.right);
  }
  traverse(root);
  return result;
}

7. 二叉树的后序遍历

题目:给定一个二叉树,返回其节点值的后序遍历结果。
示例

输入:
    1
     \
      2
     /
    3
输出:[3, 2, 1]

解法

javascript

Copy

function postorderTraversal(root) {
  const result = [];
  function traverse(node) {
    if (!node) return;
    traverse(node.left);
    traverse(node.right);
    result.push(node.val);
  }
  traverse(root);
  return result;
}

总结

二叉树是算法面试中的高频考点,掌握其基本概念和常见算法题(如遍历、深度、对称性等)是必备技能。通过递归和迭代两种方式解决问题,可以更好地理解二叉树的特性。