前言
本系列是hot100补全计划的二叉树篇,主要包含了力扣(leetcode)的二叉树章节部分的习题,除此之外还会有一些比较著名的但不包含在hot100的二叉树题目。
题目
这道题目是leetcode的第94题,链接在这里(点我)。
意思就是以左根右的方式去完成遍历。
思路
tips: 对于二叉树和链表来说,使用递归是一类通用的解题技巧
递归
使用递归法十分简单,这里仅仅贴出代码,不作解释
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
|
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
private List<Integer> ans = new ArrayList<>();
public List<Integer> inorderTraversal(TreeNode root) {
dfs(root);
return ans;
}
private void dfs(TreeNode root) {
if (root == null) {
return;
}
// 先遍历左子树
dfs(root.left);
// 把根节点值添加进来
ans.add(root.val);
// 接着遍历右子树
dfs(root.right);
}
}
|
比递归方法更难的是迭代法遍历。
迭代
我们知道,递归时默认使用的结构就是栈,也就是Last In First Out,所以,以迭代的方式,我们就可以去手动模拟一个栈出来。
tips:Java中没有直接可以使用的Stack,一般的,我们可以使用LinkedList作为替代
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
|
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
if (root == null) {
return ans;
}
// 使用栈来进行模拟
Deque<TreeNode> st = new LinkedList<>();
while (root != null || !st.isEmpty()) {
while (root != null) {
// 优先遍历所有左子树
st.push(root);
root = root.left;
}
// 栈顶元素就是左子树结点
root = st.pop();
// 根节点
ans.add(root.val);
// 右子树
root = root.right;
}
return ans;
}
}
|