题目:
给定一个 N 叉树,返回其节点值的 前序遍历 。
N 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。
进阶:
递归法很简单,你可以使用迭代法完成此题吗?
/*
// 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:
/*********************法一::递归法******************/
// // 递归函数传引用!!!!!!
// void preTravel(Node* root,vector<int>& result)
// {
// if(root == nullptr)
// {
// return;
// }
// result.push_back(root->val);
// for(int i=0; i<root->children.size(); i++)
// {
// preTravel(root->children[i],result);
// }
// }
// vector<int> preorder(Node* root) {
// vector<int> result;
// preTravel(root,result);
// return result;
// }
/**********************法二:迭代法*********************/
// 统一的迭代法,又称为标记法,精髓就是在 根结点的后面加了一个空节点作为标记
vector<int> preorder(Node* root)
{
stack<Node*> st;
vector<int> result;
if(root !=nullptr) st.push(root);
while(!st.empty())
{
Node* node = st.top();
// st.pop(); 这句话是放在if为真才执行的!!又错了!!!!
// 也就是需要有元素压栈的话,就需要先把栈顶弹出,在进行压栈操作啦~
if(node != nullptr)
{
st.pop();
for(int i=(node->children.size())-1; i>=0; i--)
{
// 这里忘记加判断条件了
if(node->children[i] != nullptr) st.push(node->children[i]);
}
st.push(node);
st.push(nullptr);
}
else
{
st.pop();
node=st.top();
st.pop();
result.push_back(node->val);
}
}
return result;
}
};