题目
给你一棵二叉树的根节点 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]输出:
[
3
,
2
,
1
]
[3,2,1]
[3,2,1]
示例
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> postorderTraversal(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);
dfs(cur -> right,vector);
vector.push_back(cur -> val);
}
};
- 思路二:使用迭代遍历
该方法与前面的前序遍历类似,仅仅需要改动一些代码顺序即可。
我们在前序遍历中得到的是根左右的顺序,因此我们先将左右的顺序互换,也就是在循环中先放入左子节点,再放入右子节点,这样就会得到根右左的顺序结果,最后再将数组顺序反转就会得到按照后序遍历得到的左右根顺序。
代码:
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> stack;
vector<int> vector;
if(root != nullptr){
stack.push(root);
}
while(stack.empty() == false){
TreeNode* cur = stack.top();
stack.pop();
vector.push_back(cur -> val);
if(cur -> left != nullptr){
stack.push(cur -> left);
}
if(cur -> right != nullptr){
stack.push(cur -> right);
}
}
reverse(vector.begin(),vector.end());
return vector;
}
};