[LintCode] Binary Tree Level Order Traversal(二叉树的层次遍历)
描述
给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问)
样例
给一棵二叉树 {3,9,20,#,#,15,7} :
  3
 / \
9  20
  /  \
 15   7
 
   返回他的分层遍历结果:
[
  [3],
  [9,20],
  [15,7]
] 
   挑战
挑战1:只使用一个队列去实现它
挑战2:用BFS算法来做
package com.ossez.lang.tutorial.tests.lintcode;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ossez.lang.tutorial.models.TreeNode;
/**
 * <p>
 * 69
 * <ul>
 * <li>@see <a href=
 * "https://www.cwiki.us/display/ITCLASSIFICATION/Binary+Tree+Level+Order+Traversal">https://www.cwiki.us/display/ITCLASSIFICATION/Binary+Tree+Level+Order+Traversal</a>
 * <li>@see<a href=
 * "https://www.lintcode.com/problem/binary-tree-level-order-traversal">https://www.lintcode.com/problem/binary-tree-level-order-traversal</a>
 * </ul>
 * </p>
 * 
 * @author YuCheng
 *
 */
public class LintCode0069LevelOrderTest {
	private final static Logger logger = LoggerFactory.getLogger(LintCode0069LevelOrderTest.class);
	/**
	 * 
	 */
	@Test
	public void testMain() {
		logger.debug("BEGIN");
		String data = "{3,9,20,#,#,15,7}";
		TreeNode tn = deserialize(data);
		System.out.println(levelOrder(tn));
	}
	/**
	 * Deserialize from array to tree
	 * 
	 * @param data
	 * @return
	 */
	private TreeNode deserialize(String data) {
		// NULL CHECK
		if (data.equals("{}")) {
			return null;
		}
		ArrayList<TreeNode> treeList = new ArrayList<TreeNode>();
		data = data.replace("{", "");
		data = data.replace("}", "");
		String[] vals = data.split(",");
		// INSERT ROOT
		TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
		treeList.add(root);
		int index = 0;
		boolean isLeftChild = true;
		for (int i = 1; i < vals.length; i++) {
			if (!vals[i].equals("#")) {
				TreeNode node = new TreeNode(Integer.parseInt(vals[i]));
				if (isLeftChild) {
					treeList.get(index).left = node;
				} else {
					treeList.get(index).right = node;
				}
				treeList.add(node);
			}
			// LEVEL
			if (!isLeftChild) {
				index++;
			}
			// MOVE TO RIGHT OR NEXT LEVEL
			isLeftChild = !isLeftChild;
		}
		return root;
	}
	private List<List<Integer>> levelOrder(TreeNode root) {
		Queue<TreeNode> queue = new LinkedList<TreeNode>();
		List<List<Integer>> rs = new ArrayList<List<Integer>>();
		// NULL CHECK
		if (root == null) {
			return rs;
		}
		queue.offer(root);
		while (!queue.isEmpty()) {
			int length = queue.size();
			List<Integer> list = new ArrayList<Integer>();
			for (int i = 0; i < length; i++) {
				TreeNode curTN = queue.poll();
				list.add(curTN.val);
				if (curTN.left != null) {
					queue.offer(curTN.left);
				}
				if (curTN.right != null) {
					queue.offer(curTN.right);
				}
			}
			rs.add(list);
		}
		return rs;
	}
}
 
点评
这个程序可以使用队列的广度优先算法来进行遍历。
需要注意的是,因为在输出结果的时候需要按照层级来进行输出,那么需要考虑的一个算法就是二叉树的层级遍历算法。
这个算法要求在遍历的时候记录树的层级。
关注公众号
					低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 
							
								
								    上一篇
								    
								
								深入解析:从源码窥探MySQL优化器
上图展示了优化器的大致执行过程,可以简单描述为: 1 根据语法树及统计统计,构建初始表访问数组(init_plan_arrays) 2 根据表访问数组,计算每个表的最佳访问路径(find_best_ref),同时保存当前最优执行计划(COST最小) 3 如果找到更优的执行计划则更新最优执行计划,否则优化结束。 从上述流程可以看出,执行计划的生成是一个“动态规划/贪心算法”的过程,动态规划公式可以表示为:Min(Cost(Tn+1)) = Min(Cost(T1))+Min(Cost(T2))+...Min(Cost(Tn-1))+Min(Cost(Tn)),其中Cost(Tn)表示访问表T1 T2一直到Tn的代价。如果优化器没有任何先验知识,则需要进行 A(n,n) 次循环,是一个全排列过程,很显然优化器是有先验知识的,如表大小,外连接,子查询等都会使得表的访问是部分有序的,可以理解为一个“被裁减”的动态规划,动态规则的核心函数为:Join::Best_extention_limited_search,在源码中有如下代码结构: bool Optimize_table_order::be...
 - 
							
								
								    下一篇
								    
								
								新手也能看懂,消息队列其实很简单
该文已加入开源项目:JavaGuide(一份涵盖大部分Java程序员所需要掌握的核心知识的文档类项目,Star 数接近 16k)。地址:https://github.com/Snailclimb/JavaGuide. 本文内容思维导图: 消息队列其实很简单 “RabbitMQ?”“Kafka?”“RocketMQ?”...在日常学习与开发过程中,我们常常听到消息队列这个关键词。我也在我的多篇文章中提到了这个概念。可能你是熟练使用消息队列的老手,又或者你是不懂消息队列的新手,不论你了不了解消息队列,本文都将带你搞懂消息队列的一些基本理论。如果你是老手,你可能从本文学到你之前不曾注意的一些关于消息队列的重要概念,如果你是新手,相信本文将是你打开消息队列大门的一板砖。 一 什么是消息队列 我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用。消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。目前使用较多的消息队列有ActiveMQ,RabbitMQ,Kafka,RocketMQ,我们后面会一一对比这些...
 
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
 - SpringBoot2编写第一个Controller,响应你的http请求并返回结果
 - CentOS7,8上快速安装Gitea,搭建Git服务器
 - Eclipse初始化配置,告别卡顿、闪退、编译时间过长
 - SpringBoot2整合Thymeleaf,官方推荐html解决方案
 - SpringBoot2全家桶,快速入门学习开发网站教程
 - MySQL表碎片整理
 - CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
 - CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
 - Docker快速安装Oracle11G,搭建oracle11g学习环境
 

			
				
				
				
				
				
				
				
微信收款码
支付宝收款码