
解题思路:
- 初始化: 创建一个结果列表和一个队列,将根节点入队。
- 循环处理: 当队列不为空时,记录当前层节点数 size,依次处理这些节点:
- 出队当前节点,将其值加入临时列表。
- 若存在左子节点,入队。
- 若存在右子节点,入队。
- 返回结果: 内层循环结束时,将临时列表加入结果列表。外层循环结束时结果列表中存储的即为层序遍历的结果。
Java代码:
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
if (root == null) return result;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
int size = queue.size();
List<Integer> list = new ArrayList<>();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
list.add(node.val);
if (node.left != null) queue.offer(node.left);
if (node.right != null) queue.offer(node.right);
}
result.add(list);
}
return result;
}
}
复杂度分析:
- 时间复杂度: O(n),其中 n 是树的节点总数。
- 空间复杂度: O(n),队列中最多存储同一层的节点数。

解题思路:
- 终止条件: 数组为空或长度为0时返回 null。
- 递归构建:
- 找到当前数组的中点,作为当前子树的根节点。
- 递归处理左半部分数组(左子树)。
- 递归处理右半部分数组(右子树)。
Java代码:
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
return buildBST(nums, 0, nums.length - 1);
}
private TreeNode buildBST(int[] nums, int left, int right) {
if (left > right) return null;
int mid = (left + right) / 2;
TreeNode root = new TreeNode(nums[mid]);
root.left = buildBST(nums, left, mid - 1);
root.right = buildBST(nums, mid + 1, right);
return root;
}
}
复杂度分析:
- 时间复杂度: O(n),每个节点被访问且仅被访问一次。
- 空间复杂度: O(log n),递归栈的深度为树的高度,平衡二叉树的高度为 log n。