题目来源
589. N叉树的前序遍历
题目描述
class Node {
public:
int val;
vector<Node*> children;
Node() {}
Node(int _val) {
val = _val;
}
Node(int _val, vector<Node*> _children) {
val = _val;
children = _children;
}
};
class Solution {
public:
vector<int> preorder(Node* root) {
}
};
题目解析
递归
class Solution {
public List<Integer> preorder(Node root) {
List<Integer> list = new ArrayList<>();
helper(root, list);
return list;
}
private void helper(Node root, List<Integer> list){
if (root == null){
return;
}
list.add(root.val);
for (Node child: root.children){
helper(child, list);
}
}
}
辅助栈
- 特例:如果root为空。返回[]
- 初始化一个链表,用来存储结果
- 初始化一个栈,将root压入栈
- 此时栈不为空,弹出栈顶元素1,此时栈顶元素不为null,将栈顶元素以及不为空的子孩子压入栈:1,null,3,2,4
- 此时栈不为空,弹出栈顶元素4,此时栈顶元素不为null,将栈顶元素以及不为空的子孩子压入栈:1,null,3,2,4,null
- 此时栈不为空,弹出栈顶元素null,因为栈顶元素为null,再次弹出一个栈顶元素4并将4压入链表。此时栈:1,null,3,2;链表:4
- 此时栈不为空,弹出栈顶元素4,此时栈顶元素不为null,将栈顶元素以及不为空的子孩子压入栈:1,null,3,2,null;链表:4
- 此时栈不为空,弹出栈顶元素null,因为栈顶元素为null,再次弹出一个栈顶元素2并将2压入链表。此时栈:1,null,3;链表:4,2
- 此时栈不为空,弹出栈顶元素3,此时栈顶元素不为null,将栈顶元素以及不为空的子孩子压入栈:1,null,3,null,5,6;链表:4,2
- 此时栈不为空,弹出栈顶元素6,此时栈顶元素不为null,将栈顶元素以及不为空的子孩子压入栈:1,null,3,null,5,6,null;链表:4,2
- 此时栈不为空,弹出栈顶元素null,因为栈顶元素为null,再次弹出一个栈顶元素6并将6压入链表。此时栈:1,null,3,null,5;链表:4,2,6
- 此时栈不为空,弹出栈顶元素5,此时栈顶元素不为null,将栈顶元素以及不为空的子孩子压入栈:1,null,3,null,5,null;链表:4,2,6
- 。。。
- 最后链表结构:4 2 6 5 3 1
- 将链表反转就可以得到结果了
class Solution {
public List<Integer> preorder(Node root) {
List<Integer> list = new ArrayList<>();
if (root == null){
return list;
}
Stack<Node> stack = new Stack<>();
stack.push(root);
while (!stack.empty()){
Node top = stack.pop();
if (top != null){
stack.push(top);
stack.push(null);
for (Node child: top.children) {
if (child != null){
stack.push(child);
}
}
}else{
Node t = stack.pop();
list.add(t.val);
}
}
Collections.reverse(list);
return list;
}
}