趣味算法题

越刷越上头的趣味算法题
帅旋
关注
充电
IT宅站长,技术博主,架构师,全网id:arthinking。

二叉树的前序遍历

发布于 2024-05-16 | 更新于 2024-08-21

题目:144. 二叉树的前序遍历[1]

如果您已经有思路了,或者是N刷了,可以先自己写一遍。

题目分析

要求对一棵二叉树进行前序遍历并返回遍历结果的列表。前序遍历的顺序是先访问根节点,然后访问左子树,最后访问右子树。这种遍历方式主要用于创建一个与原树结构相同的拷贝,因为它先处理节点本身,然后递归地处理子节点。

解题思路

对二叉树进行前序遍历同样可以采用递归或迭代的方式。递归是最直观的方法,但在深度较大的树上可能会遇到栈溢出问题。迭代方法通常使用栈来实现。

  1. 递归方法:直接按照前序遍历的定义,先处理当前节点,然后递归地遍历左子树和右子树。
  2. 迭代方法:使用栈来模拟递归过程,手动控制访问的顺序,栈先进后出的特性刚好可以用来实现前序遍历。

Java解法

递归解法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.util.ArrayList;
import java.util.List;

class TreeNode {
int val;
TreeNode left;
TreeNode right;

TreeNode(int x) {
val = x;
}
}

class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
preorder(root, result);
return result;
}

private void preorder(TreeNode node, List<Integer> res) {
if (node == null) {
return;
}
res.add(node.val); // 处理当前节点
preorder(node.left, res); // 访问左子树
preorder(node.right, res); // 访问右子树
}
}

迭代解法,稍微有点难懂:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.util.ArrayList;
import java.util.List;

class TreeNode {
int val;
TreeNode left;
TreeNode right;

TreeNode(int x) {
val = x;
}
}

class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
preorder(root, result);
return result;
}

private void preorder(TreeNode node, List<Integer> res) {
if (node == null) {
return;
}
res.add(node.val); // 处理当前节点
preorder(node.left, res); // 访问左子树
preorder(node.right, res); // 访问右子树
}
}

时间复杂度

O(n),其中 n 是树中节点的数量。无论是递归还是迭代方法,每个节点都只访问一次。

空间复杂度

递归方法的空间复杂度主要由递归栈的深度决定,最坏情况下为 O(n),在平衡树中为 O(log n)。

迭代方法的空间复杂度同样依赖于栈的使用,理论上最坏情况下也为 O(n),在平衡树中为 O(log n)。

References


  1. 144. 二叉树的前序遍历 ↩︎

本文作者: 帅旋

本文链接: https://www.itzhai.com/columns/algorithm/binary-tree-preorder-traversal.html

版权声明: 版权归作者所有,未经许可不得转载,侵权必究!联系作者请加公众号。

×
IT宅

关注公众号及时获取网站内容更新。

请帅旋喝一杯咖啡

咖啡=电量,给帅旋充杯咖啡,他会满电写代码!

IT宅

关注公众号及时获取网站内容更新。