N叉树的前序遍历(589)

题目: 给定一个 N 叉树,返回其节点值的前序遍历。

示例: 在这里插入图片描述
思路分析-迭代:
一、总的思想即是在处理完某个结点后,如何快速准确处理其左边第一个宝宝结点
二、可以考虑层序遍历,层序遍历会借助队列,初始时刻根节点入列,此后如果队列非空,就出列一个结点,并将其子结点从左到右依次入列,但是这种方式下每次从队首出列的结点可能是某个结点的左宝宝,也有可能是某个结点的右宝宝(看上文一、中加粗斜线)。此时距离前序遍历还差距离,此时看一下队尾,如果结点每次都从队尾出列,然后再将子结点从左到右入列,我们可以得到 根→右→左 的前序遍历。所以,如果我们改变一下子结点入列的顺序,然后再次从队尾出列,我们就可以得到 根->左->右 的前序遍历。
三、如果每次都从队尾出列的话,则实现了先进后出(FILO)的情景,故可以用栈来代替队列实现先进后出。

Code-迭代

class Solution {
	public List<Integer> preOrder(Node root) {
		List<Integer> res = new LinkedList<>();
		if (root == null) {
			return res;
		}
		Stack<Node> stack = new Stack<>();
		stack.push(root);
		while (!stack.isEmpty()) {
			Node cur = stack.pop();
			res.add(cur.val);
			for (int i = cur.children.size() - 1; i >= 0; i--) {
				stack.push(cur.children.get(i));
			}
		}
		return res;
	}
}

思路分析-递归
一、建立辅助函数并调用自身产生递归。
二、在主函数中调用辅助函数。

Code-递归

class Solution {
	private List<Integer> res = new LinkedList<>();
	public List<Integer> preOrder(Node root) {
		dfs(root);
		return res;
	}
	public void dfs(Node root) {
		if (root == null) {
			return;
		} else {
			for (var child : cur.children) {
				dfs(child);
			}
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值