二叉树的先序遍历

144. 二叉树的前序遍历

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

示例 1:

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

示例 2:

输入:root = []
输出:[]

示例 3:

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

示例 4:

输入:root = [1,2]
输出:[1,2]

示例 5:

输入:root = [1,null,2]
输出:[1,2]

提示:

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

代码

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
class Solution {
List<Integer> list = new ArrayList<>();
public List<Integer> preorderTraversal(TreeNode root) {
// preorder01(root);
// preorder02(root);
preorder03(root);
return list;
}


//递归
public void preorder01(TreeNode root){
if(root==null) return;
list.add(root.val);
preorder01(root.left);
preorder01(root.right);
}


//迭代
public void preorder02(TreeNode root){
if(root==null) return;
Stack<TreeNode> st = new Stack<>();
while(root!=null||!st.isEmpty()){
while(root!=null){
list.add(root.val);
st.push(root);
root = root.left;
}
TreeNode node = st.pop();
if(node.right != null){
root = node.right;
}
}
}

//迭代, Morris遍历,入栈顺序中右左
public void preorder03(TreeNode root){
if(root==null) return;
Stack<TreeNode> st = new Stack<>();
st.push(root);
while(!st.isEmpty()){
root = st.pop(); //中
list.add(root.val);
if(root.right!=null){ //右
st.push(root.right);
}
if(root.left!=null){ //左
st.push(root.left);
}
}
}

//迭代标记法
public void preorder04(TreeNode root){
if(root==null) return;
Stack<TreeNode> st = new Stack<>();
st.push(root);
while(!st.isEmpty()){
root = st.pop();
if(root!=null){
if(root.right!=null) st.push(root.right); //右
if(root.left!=null) st.push(root.left); //左
st.push(root); //中
st.push(null); //标记
}else{
root = st.pop(); //遇到空结点就访问
list.add(root.val);
}
}
}
}

二叉树的先序遍历
http://example.com/2023/03/30/算法/二叉树/1. 二叉树的先序遍历/
作者
PALE13
发布于
2023年3月30日
许可协议