LeetCode 94. 二叉树的中序遍历

94. 二叉树的中序遍历

解题思路

参考代码

递归

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
dfs(root, res);
return res;
}

private void dfs(TreeNode node, List<Integer> res) {
if(node == null) {
return;
}
dfs(node.left, res);
res.add(node.val);
dfs(node.right,res);
}
}

迭代

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
if(root == null) {
return res;
}
Stack<TreeNode> st = new Stack();
TreeNode cur = root;

while(cur != null || !st.isEmpty()) {
while(cur != null) {
st.push(cur);
cur = cur.left;
}
cur = st.pop();
res.add(cur.val);
cur = cur.right;
}
return res;
}
}

Morris遍历

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
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
if(root == null) {
return res;
}
TreeNode cur = root, pre = null;
while(cur != null) {
if(cur.left == null) {
res.add(cur.val);
cur = cur.right;
} else {
pre = cur.left;
while(pre.right != null && pre.right != cur) {
pre = pre.right;
}
if(pre.right == null) {
pre.right = cur;
cur = cur.left;
} else {
pre.right = null;
res.add(cur.val);
cur = cur.right;
}
}
}
return res;
}
}

二叉树前序遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
if(root == null) {
return res;
}
Stack<TreeNode> st = new Stack<>();
st.push(root);

while(!st.isEmpty()) {
TreeNode node = st.pop();
res.add(node.val);
if(node.right != null) st.push(node.right);
if(node.left != null) st.push(node.left);
}
return 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
30
31
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
if(root == null) {
return res;
}
Stack<TreeNode> st = new Stack<>();
st.push(root);

while(!st.isEmpty()) {
TreeNode node = st.pop();
res.add(node.val);
if(node.left != null) st.push(node.left);
if(node.right != null) st.push(node.right);
}
// Collections.reverse(res);
reverse(res);
return res;
}
// 手动实现reverse方法,避免引入Collections类
private void reverse(List<Integer> list) {
int i = 0, j = list.size() - 1;
while(i < j) {
int tmp = list.get(i);
list.set(i, list.get(j));
list.set(j, tmp);
i ++;
j --;
}
}
}

LeetCode 94. 二叉树的中序遍历
https://sowink.cn/2026/02/08/LeetCode-94-二叉树的中序遍历/
作者
Xurx
发布于
2026年2月8日
许可协议