题目: 给定一个 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);
}
}
}
}