32.Binary Tree Level Order Traversal

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值