题目
给定一个二叉树的根节点 r o o t root root ,返回 它的 中序 遍历 。
示例
1
1
1:
输入:
r
o
o
t
=
[
1
,
n
u
l
l
,
2
,
3
]
root = [1,null,2,3]
root=[1,null,2,3] 输出:
[
1
,
3
,
2
]
[1,3,2]
[1,3,2]
示例
2
2
2:
输入:
r
o
o
t
=
[
]
root = []
root=[] 输出:
[
]
[]
[]
示例
3
3
3 :
输入:
r
o
o
t
=
[
1
]
root = [1]
root=[1]输出:
[
1
]
[1]
[1]
提示:
- 树中节点数目在范围 [ 0 , 100 ] [0, 100] [0,100]内
-
−
100
<
=
N
o
d
e
.
v
a
l
<
=
100
-100 <= Node.val <= 100
−100<=Node.val<=100
思路
- 思路一:使用递归遍历
该方法在此不作阐述,参考力扣第
144
144
144题的前序遍历思路即可。
代码:
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> vector;
dfs(root,vector);
return vector;
}
void dfs(TreeNode* cur,vector<int>& vector){
if(cur == nullptr){
return;
}
dfs(cur -> left,vector);
vector.push_back(cur -> val);
dfs(cur -> right,vector);
}
};
- 思路二:使用迭代遍历
该方法与前面的前序遍历又有一些不同,不是简单改动一些顺序即可。
我们在前序遍历中对于节点的操作主要分为两种:
- 访问:遍历到当前节点。
- 操作:将当前节点放到数组中。
在之前的操作中我们都是遍历到那个节点就将该节点从栈中取出,因此我们对于每个节点的访问和操作是一致的。但是在这次的中序遍历中我们并非是访问到那个节点就对那个节点进行操作,而是先一直访问到最左侧的叶节点,然后对其进行操作。
例如在上图中的二叉树进行中序遍历时,我们最先放到数组中的节点是左下值为
1
1
1 的节点,但是我们首先访问到的节点确是根节点,因此我们需要一个指针指向我们当前访问的节点,并且使用判断是否到了最低端然后进行操作。
当指针指到底部时,我们其中的栈顶元素也就是当前节点的值放到数组中。
根据中序遍历的顺序,访问了左节点和根节点,接下来需要访问右节点,也就是使
c
u
r
=
c
u
r
−
>
r
i
g
h
t
cur = cur -> right
cur=cur−>right。但是由于该节点为空,因此我们退回访问上一级的根节点。
按照相同的规则,我们将当前节点的值放入数组中,接着将
c
u
r
=
c
u
r
−
>
r
i
g
h
t
cur = cur -> right
cur=cur−>right。
最终得到这样的结果。
代码:
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
//初始化
stack<TreeNode*> stack;
vector<int> vector;
TreeNode* cur = root;
//loop
while(stack.empty() == false || cur != nullptr){
//首先来到最左侧节点
if(cur != nullptr){
stack.push(cur);
cur = cur -> left;
}else{
cur = stack.top();
stack.pop();
vector.push_back(cur -> val);
cur = cur -> right;
}
}
return vector;
}
};