// 递归,前序遍历
public void preorder(Node root) {
if (root == null) {
return;
}
/*用root在这里写业务代码*/
for (Node node : root.children) {
preorder(node, result);
}
}
// 迭代,前序遍历
public void preorder(Node root) {
Stack<Node> stack = new Stack<>();
if (root == null) {
return;
}
stack.push(root);
while (!stack.isEmpty()) {
Node pop = stack.pop();
/*用root在这里写业务代码*/
for (int i = pop.children.size() - 1; i >= 0; i --) { // 注意这里是从大到小压栈
stack.push(pop.children.get(i));
}
}
}
// 递归,后序遍历
public void postorder(Node root) {
if (root == null) {
return;
}
for (Node node : root.children) {
helper(node, result);
}
/*用root在这里写业务代码*/
}
// 迭代,后序遍历
public void postorder(Node root) {
List<Integer> result = new ArrayList<>();
Set<Node> visited = new HashSet<>();
Stack<Node> stack = new Stack<>();
if (root == null) {
return result;
}
stack.push(root);
while (!stack.isEmpty()) {
Node peek = stack.peek();
if (peek.children.size() == 0 || visited.contains(peek)) {
Node pop = stack.pop();
/*用pop在这里写业务代码*/
continue;
}
for (int i = peek.children.size() - 1; i >= 0; i --) { // 注意这里从大到小压栈
stack.push(peek.children.get(i));
}
visited.add(peek);
}
}