LC589-N叉树的前序遍历
原创
©著作权归作者所有:来自51CTO博客作者靠谱的大钊的原创作品,请联系作者获取转载授权,否则将追究法律责任
难度简单128
给定一个 N 叉树,返回其节点值的前序遍历。
例如,给定一个 3叉树
:
返回其前序遍历: [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;
}