领扣--N叉树的前序遍历
之前写过二叉树的遍历,当时认为递归是很简单的,但是之前忽略了一个问题,当时在遍历的时候都是直接输出,并没有说将结果存起来,但是如果在线编程的话,是一定会让结果保存在一个数据结构中的。
所以这里在最初的时候即使是二叉树也不能像之前写的那样直接输出,如果在函数首部定义一个vector每次递归都会重新创建,里边的数据保存不下来,我也想过定义一个全局变量,但是这样也不妥,这样的话返回值返回什么。
class Node {
public:
int val;
vector<Node*> children;
Node() {}
Node(int _val, vector<Node*> _children) {
val = _val;
children = _children;
}
};
class Solution {
public:
vector<int> preorder(Node* root) {
vector<int> ret;
Preorder(root,ret);
return ret;
}
void Preorder(Node* root, vector<int>& ret)
{
if (root == NULL)
return;
ret.push_back(root->val);
int i = 0;
int length = root->children.size();
for (i = 0; i < length; i++)
{
Preorder(root->children[i], ret);
}
}
};
之后就另外创建了一个函数,这个函数是可以传一个vector引用进去的,这样就很好的解决了这个问题。这里也是以前都是访问左然后访问右,但是这里需要通过循环去依次访问。
同样递归的遍历是很简单一种情况,那非递归怎么实现,还是和二叉树一样,不过是比二叉树多处理了几次而已。
class Solution {
public:
vector<int> preorder(Node* root) {
vector<int> ret;
if (root == NULL)
return ret;
stack<Node*> tree;
tree.push(root);
while (!tree.empty())
{
Node* cur = tree.top();
tree.pop();
ret.push_back(cur->val);
int i = 0;
int length = cur->children.size();
for (i = length-1; i >= 0; i--)
{
tree.push(cur->children[i]);
}
}
return ret;
}
};
通过创建一个栈,来存储数据。但是这里需要注意的是
for (i = length-1; i >= 0; i--)
{
tree.push(cur->children[i]);
}
这里去访问孩子结点的时候是倒着访问数组的因为我们创建的是一个栈,栈是先进后出的,为了先在栈顶访问到下标为0的孩子结点,就需要最后让他入栈。