LeetCode--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的孩子结点,就需要最后让他入栈。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值