【题目】
给定一个 N 叉树,返回其节点值的后序遍历。
例如,给定一个 3叉树 :
返回其后序遍历: [5,6,3,2,4,1]。
说明: 递归法很简单,你可以使用迭代法完成此题吗?
来源:leetcode
链接:https://leetcode-cn.com/problems/n-ary-tree-postorder-traversal/
【递归法】
60ms 105.8 跟迭代法相比这个简直太垃圾了
/*
// Definition for a Node.
class Node {
public:
int val;
vector<Node*> children;
Node() {}
Node(int _val) {
val = _val;
}
Node(int _val, vector<Node*> _children) {
val = _val;
children = _children;
}
};
*/
class Solution {
public:
vector<int> v;
vector<int> postorder(Node* root) {
if(root==NULL)
return v;
for(auto x:root->children)
postorder(x);
v.push_back(root->val);
return v;
}
};
【知识点】
对vector数组进行查询,实现vector的find()功能,vector本身是没有find()函数的,但是我们可以用algorithm头文件下的find()函数实现对vector数组中的查询操作。
具体实现:vector<Node*>::iterator it=find(v.begin(),v.end(),lastVisit);其中lastVisit为需要在vector数组中寻找的元素。
【迭代法】
执行用时 :40 ms, 在所有 C++ 提交中击败了91.03% 的用户
内存消耗 :11.7 MB, 在所有 C++ 提交中击败了100.00%的用户
class Solution {
public:
//同层节点,从右向左一次进栈
vector<int> v;
stack<Node*> s;
vector<int> postorder(Node* root) {
if(!root)
return v;
Node *node=root;
Node *lastVisit=NULL;
s.push(root);
while(!s.empty()){
node=s.top();
vector<Node*>::iterator it=find(node->children.begin(),node->children.end(),lastVisit);
for(int i=node->children.size()-1;i>=0&&(it==node->children.end());i--)
s.push(node->children[i]);
if(node->children.size()==0||it!= node->children.end()){
v.push_back(node->val);
lastVisit=node;
s.pop();
}
}
return v;
}
};