package leetcode.wyj;
import leetcode.model.Node;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/**
* 给定一个 N 叉树,返回其节点值的前序遍历。
* <p>
* 例如,给定一个 3叉树
* <p>
* 返回其前序遍历: [1,3,5,6,2,4]。
* <p>
* 说明: 递归法很简单,你可以使用迭代法完成此题吗?
* <p>
* 来源:力扣(LeetCode)
* 链接:https://leetcode-cn.com/problems/n-ary-tree-preorder-traversal
* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*/
/**
* 学习树先序遍历
*/
public class LeetCode589 {
public static void main(String[] args) {
List<Node> list1 = new ArrayList<>();
list1.add(new Node(5));
list1.add(new Node(6));
List<Node> list2 = new ArrayList<>();
list2.add(new Node(3, list1));
list2.add(new Node(2));
list2.add(new Node(4));
Node node = new Node(1, list2);
preorder2(node);
}
/*1.使用递归*/
public static List<Integer> preorder(Node root) {
List<Integer> res = new ArrayList<>();
getValue(root, res);
return res;
}
private static void getValue(Node node, List<Integer> res) {
if (node == null) {
return;
}
res.add(node.getVal());
if (node.getChildren() != null) {
for (Node child : node.getChildren()) {
getValue(child, res);
}
}
}
/**
* 不使用递归,使用栈模拟递归
**/
public static List<Integer> preorder2(Node root) {
List<Integer> res = new ArrayList<>();
Stack<Node> stack = new Stack<>();
if (root == null) {
return null;
}
stack.push(root);
while (!stack.isEmpty()) {
Node node = stack.pop();
res.add(node.getVal());
List<Node> children = node.getChildren();
if (children != null) {
for (int i = children.size() - 1; i >= 0; i--) {
stack.push(children.get(i));
}
}
}
return res;
}
}