QUESTION
easy
明明二叉树的后序遍历是困难!这个为什么是easy嘛!
题目描述
给定一个 N 叉树,返回其节点值的后序遍历
例如,给定一个 3 叉树:
返回其后序遍历: [5,6,3,2,4,1]
说明
递归法很简单,你可以使用迭代法完成此题吗?
SOLUTION
- 后序遍历可以理解为,从左到右再到根
- 前面题目描述也提到了,递归很简单,进阶用迭代法
方法一(递归)
vector<int> postorder(Node* root) {
vector<int> res;
helper(root, res);
return res;
}
void helper(Node* node, vector<int>& res){
if(!node) return;
for(auto child : node->children){
helper(child, res);
}
res.push_back(node->val);
}
方法二(迭代, 双栈)
- 代码可能不够简洁
- 双栈实现的,一个栈记录过程,一个栈输出结果
- 我在测试这个方法的时候比递归耗时还长,有待考量吧
vector<int> postorder(Node* root) {
vector<int> res;
if(!root) return res;
stack<Node*> sin;
stack<Node*> sout;
sin.push(root);
sout.push(root);
Node* p = NULL;
Node* q = NULL;
while(!sout.empty()){
p = sout.top();
if(!sin.empty()) q = sin.top();
else q = NULL;
if(p == q){
if(!q->children.empty()){
sin.pop();
for(int i = p->children.size() - 1; i >= 0; i--){ //逆序进栈
sin.push(p->children[i]);
sout.push(p->children[i]);
}
}
else{
res.push_back(p->val);
sin.pop();
sout.pop();
}
}
else{
res.push_back(p->val);
sout.pop();
}
}
return res;
}
方法三(迭代, 单栈)
这个办法和之前的方法有本质的不同,顺序入栈,只用一个栈就完成了,是简洁又好的办法,结果反序恰好就是正确答案
vector<int> postorder(Node* root) {
vector<int> res;
if(!root) return res;
stack<Node*> s;
s.push(root);
while(!s.empty()){
Node* p = s.top();
s.pop();
res.push_back(p->val);
for (auto child : p->children){
s.push(child);
}
}
reverse(res.begin(), res.end());
return res;
}