力扣 title589:N叉树的前序遍历
给定一个 n 叉树的根节点 root
,返回 其节点值的 前序遍历 。
n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null
分隔(请参见示例)。
思路:
1.初始化时,使用列表存储子节点。
2. 遍历时,使用栈存储节点,比如根节点的子节点,按照4,2,3的顺序入栈,则出栈时为3,2,4。值为③的节点,需要让6,5依次入栈,则出栈时是5,6。
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class TreeDemo {
public static void main(String[] args) {
Node root=createTree();
List<Integer> result=preorder(root);
System.out.println(result);
}
//创建N叉树
public static Node createTree(){
Node root=new Node(1); //创建根节点
Node node2=new Node(3);
Node node3=new Node(2);
Node node4=new Node(4);
List<Node> list1=new ArrayList<>();
list1.add(node2);
list1.add(node3);
list1.add(node4);
root.children=list1;
Node node5=new Node(5);
Node node6=new Node(6);
List<Node> list2=new ArrayList<>();
list2.add(node5);
list2.add(node6);
node2.children=list2;
return root;
}
//前序遍历N叉树
public static List<Integer> preorder(Node root) {
List<Integer> result=new ArrayList<>();
Stack<Node> stack=new Stack();
if(root!=null){
stack.push(root);
}
while (!stack.empty()){
Node node=stack.pop();
result.add(node.val);
//node.children是一个节点列表,里面存储了节点的子节点
while (node.children!=null){
int index=node.children.size();
index--;
if(index<0) break; //防止角标溢出
//利用index--,使得节点倒序入栈
stack.push(node.children.get(index));
node.children.remove(index);
}
}
return result;
}
}