二叉树:按层输出

    给定一个二叉树,要求从下往上输出每层的元素值。如以下二叉树,则输出的结果为[[15,7],[9,20],[3]]。

二叉树:按层输出_第1张图片

    按照二叉树的搜索策略,有宽度优先搜索和深度优先搜索两种方法。

    一、宽度优先搜索方法BFS:把二叉树的节点装进队列里,利用队列先进先出的特点,来按层级的顺序遍历二叉树。这种方法访问顺序与题目要求的输出一致,更为简洁。

  public List> levelOrderBottom(TreeNode root) {
	   List> result = new LinkedList>();
	   if(root == null)
		   return result;
	   LinkedList queue = new LinkedList();
	   queue.offer(root);
	   while(!queue.isEmpty()) {
		   List subList = new LinkedList();
           int levelSize = queue.size();    //记录每层的元素个数,每层建立一个subList
		   for(int i = 0; i < levelSize; i++) {    //按层循环,循环次数为每层的元素个数
			   TreeNode node = queue.poll();    //访问完后从队列删除,保证queue.size()等于每层的元素个数
			   if(node.left != null) queue.offer(node.left);
			   if(node.right != null) queue.offer(node.right);
			   subList.add(node.val);   
		   }
		   result.add(0,subList);    //第一个参数为index,从链表头插入
	   }
	   return result;
   }

    二、深度优先搜索方法DFS:使用递归算法,把层级数作为参数传递,根据层级数把节点加入到相应的列表中。

   public List> levelOrderBottom(TreeNode root) {
	   LinkedList> result = new LinkedList>();
	   if(root == null)
		   return result;
	   BFS(root, 1, result);
	   Collections.reverse(result);    //要求的结果为BFS返回值的倒序
	   return result;
   }
   public void BFS(TreeNode root, int level, LinkedList> list) {
	   if(root == null)    //到达叶子节点,直接返回
		   return;
	   if(list.size() < level) {    //采用先序遍历,如果list.size subList = new LinkedList();
		   list.add(subList);
	   }
	   list.get(level -1).add(root.val);
	   if(root.left != null) BFS(root.left, level + 1, list);   
	   if(root.right != null) BFS(root.right, level + 1, list);
   }

你可能感兴趣的:(二叉树)