144. 二叉树的前序遍历(简单)

1,问题描述

144. 二叉树的前序遍历

难度:简单

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

示例 1:

**输入:**root = [1,null,2,3]

输出:[1,2,3]

解释:

img

示例 2:

**输入:**root = [1,2,3,4,5,null,8,null,null,6,7,9]

输出:[1,2,4,5,6,7,3,8,9]

解释:

img

示例 3:

**输入:**root = []

输出:[]

示例 4:

**输入:**root = [1]

输出:[1]

提示:

  • 树中节点数目在范围 [0, 100]
  • -100 <= Node.val <= 100

**进阶:**递归算法很简单,你可以通过迭代算法完成吗?

2,相关知识点

​ 二叉树的前序、中序、后序、层序遍历

3,解法

3.1,递归方法

​ 使用了系统栈简化了计算

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// 递归:前序遍历
public void recursion_pre(TreeNode root, List<Integer> res) {
if (root == null) {
return;
}
res.add(root.val);
recursion_pre(root.left, res);
recursion_pre(root.right, res);
}

// 递归:中序遍历
public void recursion_mid(TreeNode root, List<Integer> res) {
if (root == null) {
return;
}
recursion_mid(root.left, res);
res.add(root.val);
recursion_mid(root.right, res);
}

// 递归:后序遍历
public void recursion_later(TreeNode root, List<Integer> res) {
if (root == null) {
return;
}
recursion_later(root.left, res);
recursion_later(root.right, res);
res.add(root.val);
}

// 递归:层序遍历
public void recursion_level(TreeNode root, List<TreeNode> temp, List<Integer> res) {
if (temp.isEmpty()) {
return;
}
List<TreeNode> tempCur = new ArrayList<>();
for (TreeNode treeNode : temp) {
if (treeNode != null) {
res.add(treeNode.val);
tempCur.add(treeNode.left);
tempCur.add(treeNode.right);
}
}
recursion_level(root, tempCur, res);
}

3.2,迭代方法

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

// 迭代:前序遍历
public List<Integer> preOrderIteration_pre(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
if (root == null) {
return res;
}
Deque<TreeNode> stack = new ArrayDeque<>();
stack.add(root);
while (!stack.isEmpty()) {
TreeNode pop = stack.pop();
if (pop.right != null) stack.push(pop.right);
if (pop.left != null) stack.push(pop.left);
res.add(pop.val);
}
return res;
}

// 迭代:中序遍历
// 向左边遍历,然后倒过来
public List<Integer> preOrderIteration_mid(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
if (root == null) {
return res;
}
Deque<TreeNode> stack = new ArrayDeque<>();
TreeNode node = root;
while (!stack.isEmpty() || node != null) {
while (node != null) {
stack.push(node);
node = node.left;
}
TreeNode pop = stack.pop();
res.add(pop.val);
node = pop.right;
}
return res;
}

// 迭代:后序遍历
public List<Integer> preOrderIteration_later(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
if (root == null) {
return res;
}
Deque<TreeNode> stack1 = new ArrayDeque<>();
stack1.push(root);
while (!stack1.isEmpty()) {
TreeNode pop = stack1.pop();
res.add(pop.val);
if (pop.left != null) stack1.push(pop.left);
if (pop.right != null) stack1.push(pop.right);
}
Collections.reverse(res);
return res;
}

3.3,Morris解法

​ 感觉不是做竞赛的,可以只用知道有这样的一种方法即可

​ 时间复杂度O(n)、空间复杂度O(1)