leetcode微软谷歌面试题102. Binary Tree Level Order Traversal

102. 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,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

return its level order traversal as:

[
  [3],
  [9,20],
  [15,7]
]

这道题是树的层序遍历题,也是广度搜索,题目的大致意思就是遍历二叉树,将每一层的节点值拼装成一个序列,最后将所有的序列拼装成一个

大的序列,并且返回该序列。

下面给出一段最简单的层序遍历代码,该代码是最基本的层序遍历代码,层序遍历一般都会借助队列实现。如果队列不为空就将队列该节点出队,并将该队列的不为空的左右孩子入队,直到队列为空,才把节点遍历完全

public static void levelOrder(TreeNode root) {
		 Queue queue = new LinkedList() ;
		 queue.add(root);
		 if(root == null)
			 return;
		 while(!queue.isEmpty())
		 {
			
			 TreeNode temp =  (TreeNode) queue.poll();
			 System.out.println(temp.val+" ");
			 if(temp.left != null)
				 queue.add(temp.left);
			 if(temp.right != null)
				 queue.add(temp.right);
		 }
	    }
这道题的层序遍历也是我们在这个基础上做的,首先遍历完每层节点后我们都添加一个标识为,该标志位我们设置为null。

这样我们每次出队一个节点node,并将node的不为空的左右孩子入队,直到发现队列里的节点node为null时就说明该节点

上一层的节点全部遍历完全,并且已经将上一层所有节点的左右孩子都已经入队列,这时队列入队null,标志该层次结束。

每次判断队列时,队列的大小必须得大于1,因为最后一个节点一定是null节点。

代码如下

public class binarytreeleveltraversal {	
	  public static List<List<Integer>> levelOrder(TreeNode root) {
		  List<List<Integer>> lists = new LinkedList();
		  Queue<TreeNode> queue = new LinkedList();
		  
		  if(root == null)
			  return lists;
		  List list = new LinkedList();
		  //设置一个标志,如果说发现null标志的话就说明这一层完结
		  queue.add(root);
		  queue.add(null);
		  while(queue.size()>1)//因为最后一个节点一定是null
		  {
			  TreeNode node = queue.poll();
			  if(node == null)
			  {
				  lists.add(list);
				  queue.add(null);
				  list = new LinkedList();//每次到下一层时就重新生成list对象
			  }
			  else
			  {
				  list.add(node.val);
				  if(node.left!=null)
				  {
					  queue.add(node.left);
				  }
				  if(node.right!=null)
				  {
					  queue.add(node.right);
				  }  
			  }
		  }
		  lists.add(list);//最后一次遍历组装的list拼装到lists
	        return lists;
	    }
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TreeNode root = new TreeNode(1);
		TreeNode root1 = new TreeNode(4);
		TreeNode root2 = new TreeNode(2);
		TreeNode root3 = new TreeNode(3);
		root.left = root1;
		root.right = root2;
		root2.left = root3;
		System.out.println(levelOrder( root));
	}
}
刚开始做这道题时一直在想存储遍历内容的数据结构,也发现了一些问题,比如:如果lists的size<=你获取址的index的话,就会出现错误,所以list并不想数组一样,它没有内容时不能用get方法,只有add后才能获取。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值