二叉树的定义
二叉树(Binary Tree)是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树是算法和数据结构中非常重要的概念,广泛应用于搜索、排序、动态规划等场景。
二叉树的基本性质
-
节点:每个节点包含数据、左子节点和右子节点。
-
根节点:树的顶部节点,没有父节点。
-
叶子节点:没有子节点的节点。
-
深度:从根节点到当前节点的路径长度。
-
高度:从当前节点到叶子节点的最长路径长度。
-
满二叉树:每个节点都有 0 或 2 个子节点。
-
完全二叉树:除了最后一层,其他层都是满的,且最后一层节点从左到右排列。
二叉树的遍历方式
-
前序遍历(Pre-order) :根节点 → 左子树 → 右子树。
-
中序遍历(In-order) :左子树 → 根节点 → 右子树。
-
后序遍历(Post-order) :左子树 → 右子树 → 根节点。
-
层序遍历(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;
}
总结
二叉树是算法面试中的高频考点,掌握其基本概念和常见算法题(如遍历、深度、对称性等)是必备技能。通过递归和迭代两种方式解决问题,可以更好地理解二叉树的特性。