​589. N叉树的前序遍历​

难度简单128
给定一个 N 叉树,返回其节点值的前序遍历

例如,给定一个 ​​3叉树​​ :

LC589-N叉树的前序遍历_leetcode

返回其前序遍历: ​​[1,3,5,6,2,4]​​。

递归

<Integer> list = new LinkedList<>();

public List<Integer> preorder(Node root) {
dfs(root);
return list;


}

private void dfs(Node root) {
if (root == null) {
return;
}
list.add(root.val);
if (root.children == null) {
return;
}
for (Node chlid : root.children) {
dfs(chlid);
}
}

迭代

  • 使用一个栈来帮助我们得到前序遍历,需要保证栈顶的节点就是我们要遍历到的节点,
  • 首先使用跟节点入栈,因为根节点是前序遍历中的第一个节点,随后每次我们从栈顶取出一个节点​​u​​​ 他就是我们当前遍历到的节点,并把​​u​​ 的所有结点逆序推入栈中
  • 例如​​u​​​ 的子结点从​​v1, v2, v3​​​,那么推入栈的顺序应当为​​v3, v2, v1​​​, 这样就保证了下一个遍历到的节点即​​u​​​ 的第一个子节点​​v1​​)出现在栈顶的位置。
public List<Integer> preorder1(Node root) {
LinkedList<Node> stack = new LinkedList<>();
LinkedList<Integer> output = new LinkedList<>();
if (root == null) {
return output;
}
stack.push(root);
while (!stack.isEmpty()) {
Node node = stack.pop();
output.add(node.val);
Collections.reverse(node.children);
for (Node item : node.children) {
stack.push(item);
}
}
return output;
}