二叉树的中序遍历

LeetCode每日一题,94. Binary Tree Inorder Traversal

先看题目描述

就是给定一个二叉树,让返回其中序遍历序列

算法和思路

递归

直接用递归的算法十分简单,定义 dfs(root) 表示当前遍历到 root 节点的答案,那么按照定义,我们只要递归调用 dfs(root.left) 来遍历root 节点的左子树,然后将 root 节点的值加入答案,再递归调用 dfs(root.right) 来遍历 root 节点的右子树即可,递归终止的条件为碰到空节点

其实就是上一方法中的递归函数用迭代来实现,两种方式等价。区别在于递归的时候维护了一个隐形的栈,而在迭代的时候则是显式的将这个栈模拟出来

算法源码

递归

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
import java.util.ArrayList;
import java.util.List;

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private List<Integer> res = new ArrayList<>();

public List<Integer> inorderTraversal(TreeNode root) {
inorder(root);
return res;
}

private void inorder(TreeNode root) {
if (root == null) return;
inorder(root.left);
res.add(root.val);
inorder(root.right);
}
}

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<Integer>();
LinkedList<TreeNode> stk = new LinkedList<TreeNode>();
while (root != null || !stk.isEmpty()) {
while (root != null) {
stk.add(root);
root = root.left;
}
root = stk.pollLast();
res.add(root.val);
root = root.right;
}
return res;
}
}