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,#,#,15,7}
,
3 / \ 9 20 / \ 15 7
return its level order traversal as:
[ [3], [9,20], [15,7] ]分析:题目的意思是对二叉树进行宽度优先遍历,然后把同一层的节点值放到同一个list中。
思路:
准备工作,1.让List<TreeNode> nodelist = new ArrayList();//维护二叉树中的所有节点,按照宽度优先遍历的顺序;在代码运行的过程中会进行这个list的增加和删除操作
2.list1准备存放的是当前层的节点值;
3.curcount 放的是当前要生成层的节点值的个数;
在nodelist 不为空的前提下,进行如下步骤的循环。
Step1 :判断当前取的次数是否已超过当前层节点值的个数,若是则结束转Step4,否则转Step2;
Step2 : 遍历nodelist获取第一个节点node,
Step3 :做三件事情:1.把它的左右孩子节点也放到nodelist中(每增加一个节点计数加1);2.把当前节点node的值放到list1中;3.然后删除这个节点。
Step4 : 把list1加入到结果集中。
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> resultList = new ArrayList();
if(root==null){
}else{
List<Integer> list1 = null; //放的是当前要生成层的节点值
List<TreeNode> nodelist = new ArrayList();//维护二叉树中的所有节点,按照宽度优先遍历的顺序
nodelist.add(root);
int curcount = 1;//放的是当前要生成层的节点值的个数
int pos = 0;
int temp =1;
while(!nodelist.isEmpty()){
curcount = temp;
temp=0;
pos=0;
list1 = new ArrayList();
for(;pos<curcount;pos++){
TreeNode node = nodelist.get(0); //每次都是获取当前队列的头结点,因为在用完该节点之后立即对其进行了删除操作
int num = node.val;
System.out.println("num = "+num);
list1.add(num);
if(node.left!=null){
nodelist.add(node.left);
temp++;
}
if(node.right!=null){
nodelist.add(node.right);
temp++;
}
nodelist.remove(0);
}
resultList.add(list1);
}
}
return resultList;
}
上面代码是第一次做的时候参考别人的,后面刷剑指offer时自己写了一遍。
/**
* 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
* 首先找到当前层的所有结点加入到最后的结果中,然后找到逐个把当前层的元素拿出来并从链表中删除,然后找到这个元素的孩子节点,
* 将其加入到链表的尾端,这样把当前层结点的所有孩子节点找到之后,链表中就只剩下一层的节点,然后把下一层看做当前层继续循环。
* 循环结束的条件是链表为空。
*/
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
/*新建一个链表作为最后的结果返回*/
ArrayList<ArrayList<Integer> > result = new ArrayList<ArrayList<Integer> >();
if(pRoot == null){
return result;
}
ArrayList<TreeNode> tempList = new ArrayList<TreeNode>();//临时存放节点
ArrayList<Integer> valList ;
valList = new ArrayList<Integer>();//存放正在寻找的那一层的结点值
tempList.add(pRoot);
valList.add(pRoot.val);
int current = 1;//记录当前层还有剩需要找气孩子节点的节点个数。
int temp = 0;//记录目前找到的下一层的节点数
while(!tempList.isEmpty()){
/*把目前找到的那一层的结果放到最后的结果中*/
result.add(valList);
valList = new ArrayList<Integer>();
/*继续通过当前层找下一层*/
while(current!=0){
/*找到当前层中目前剩余的第一个结点,拿到之后从链表中删除*/
TreeNode node = tempList.get(0);
tempList.remove(0);
current--;
/*若其左右节点存在则加入到tempList中*/
if(node.left != null){
tempList.add(node.left);
valList.add(node.left.val);
temp++;
}
if(node.right != null){
tempList.add(node.right);
valList.add(node.right.val);
temp++;
}
}
/*为下一次寻找做初始化工作*/
current = temp;
temp = 0;
}
return result;
}