父节点有且最多只有两个子节点的树称为二叉树,N叉树则是父节点有N个子节点。
由于N叉树有多个子节点,因此没有中序遍历,只剩下前序遍历、后序遍历和层序遍历。
前序遍历
和二叉树类似,遍历的顺序是
根节点-左子节点-其他子节点-右子节点
前序遍历的结果:[1,3,5,6,2,4]
public List<Integer> preorder(Node root) {
List<Integer> list=new ArrayList<Integer>();
if(root==null){
return list;
}
list.add(root.val);
for(int i=0;i<root.children.size();i++){
list.addAll(preorder(root.children.get(i)));
}
return list;
}
后序遍历
子节点放前根结点放后,上图
后序遍历的结果:[5,6,3,2,4,1]
public List<Integer> postorder(Node root) {
ArrayList<Integer> list=new ArrayList<Integer>();
if(root==null){
return list;
}
for(int i=0;i<root.children.size();i++){
list.addAll(postorder(root.children.get(i)));
}
list.add(root.val);
return list;
}
层序遍历
层序遍历的结果:
[
[1],
[3,2,4],
[5,6]
]
public List<List<Integer>> levelOrder(Node root) {
ArrayList<Integer> levelList=new ArrayList<Integer>();
ArrayList<List<Integer>> list=new ArrayList<List<Integer>>();
LinkedList<Node> stack=new LinkedList<Node>();
stack.offer(root);
while(!stack.isEmpty()){
int size=stack.size();
for(int i=0;i<size;i++){
Node node=stack.poll();
if(node==null)continue;
for(int j=0;j<node.children.size();j++){
stack.offer(node.children.get(j));
}
levelList.add(node.val);
}
if(levelList.size()>0)
list.add(levelList);
levelList=new ArrayList<Integer>();
}
return list;
}
N叉树的深度
public int maxDepth(Node root) {
if(root==null){
return 0;
}
int max=0;
for(int i=0;i<root.children.size();i++){
int temp=maxDepth(root.children.get(i));
if(temp>max){
max=temp;
}
}
return max+1;
}
由于N叉树没有什么特别的性质,所以常见的操作不是很多,全部的代码在GitHub,所采用的序列化为Json。
网友评论