层序遍历二叉树,并且还要分层输出。
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).
For example:
Given binary tree [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
return its level order traversal as:
[ [3], [9,20], [15,7] ]
遇到了几个坑,
1。怎么分层,我是用null这个标记,当第一次在root入队后,加null,在出队遇到null的时候,正好下面一层已经全部入队,再加一个null标记,用来区分这一层
2;因为要把List,插入list中,但是我忘了list只是引用,我再clear list之后,插入list中的小list也会被清空。所以导致输出结果是全空。解决的方法,是在插入之前创建一个新的对象,赋值之后再插入。
太坑了,搞了好久。。
public static void main(String[] args) {
TreeNode root=new TreeNode(3);
TreeNode L2L=new TreeNode(9);
TreeNode L2R=new TreeNode(20);
TreeNode L3L=new TreeNode(15);
TreeNode L3R=new TreeNode(7);
root.left=L2L;
root.right=L2R;
L2R.left=L3L;
L2R.right=L3R;
//levelOrder(root);
System.out.println(levelOrder(root));
}
//二叉树的层数遍历,原理是队列,如果要分层,可以加一个标记,比如null
public static List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> LLs =new ArrayList<List<Integer>>();
if(root==null){
return LLs;
}
List<Integer> ls=new ArrayList<Integer>();
LinkedList<TreeNode> q=new LinkedList<TreeNode>();
q.addLast(root);
//可以画出规律,就是这个null的标记的用法,遇到null,说明当前层出队完成,然后再入一个null,正好是下一层入完队之后
q.addLast(null);
while(q.size()>0){
TreeNode T=q.removeFirst();
if(T==null){
//因为ls是一个引用,所以后面要clear他的时候,就要清掉引用的值,所以,用一个新的对象拿出来
List<Integer> L=new ArrayList<Integer>();
for(int i=0;i<ls.size();i++){
L.add(ls.get(i));
}
LLs.add(L);
//System.out.println(LLs);
ls.clear();
if(q.size()==0){
break;
}
q.addLast(null);
continue;
}else{
ls.add(T.val);
}
if(T.left!=null){
q.addLast(T.left);
}
if(T.right!=null){
q.addLast(T.right);
}
}
return LLs;
}
}

本文介绍了一种实现二叉树层序遍历的方法,通过使用队列和特殊标记来区分不同层级的节点,同时解决了遍历过程中的一些常见问题。
279

被折叠的 条评论
为什么被折叠?



