32.Binary Tree Level Order Traversal

来源:互联网 发布:中国联合网络通信缴费 编辑:程序博客网 时间:2024/06/10 13:16

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;    }


1 0