树和堆(julyedu网课整理)
date: 2018-12-05 16:59:15
updated: 2018-12-05 16:59:15
树和堆(julyedu网课整理)
1 定义
1.1 树的定义
它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
- 每个节点有零个或多个子节点
 - 没有父节点的节点称为根节点
 - 每一个非根节点有且只有一个父节点
 - 除了根节点外,每个子节点可以分为多个不相交的子树
 
1.2 堆的定义
堆的实现通过构造二叉堆(binary heap),实为二叉树的一种;由于其应用的普遍性,当不加限定时,均指该数据结构的这种实现。这种数据结构具有以下性质:
- 任意节点小于(或大于)它的所有后裔,最小元(或最大元)在堆的根上(堆序性)。
 - 堆总是一棵完全树。即除了最底层,其他层的节点都被元素填满,且最底层尽可能地从左到右填入。
 - 将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
 
2 基本操作
2.1 树的基本操作
- 遍历:前中后序遍历;层次遍历
 - 序列化与反序列化
 - 深度:最大深度,最小深度。
 
2.2 堆的基本操作
- 插入元素,调整新元素使之满足堆条件。
 - 删除元素,调整新元素使之满足堆条件。
 
3 树和堆的应用场景
- C++ STL的set与map(红黑树)
 - 数据库索引(B+树)
 - 优先队列(堆)
 - 语法树
 - 决策树
 - 游戏场景管理(八叉树或BSP树)
 
4 树和堆相关算法
- 递归
 - 分治
 - 深度优先搜索
 - 广度优先搜索
 
5 例题
求公共最近的父节点:给定一棵二叉树,找到两个节点的最近公共父节点(LCA)。最近公共祖先是两个节点的公共的祖先节点且具有最大深度。

对于上面例子:LCA(3, 5) = 4; LCA(6, 7) = 7
5.1 思路
- 如果以LCA为根节点,那么A、B必定分别位于该节点的左右子树。
 - 如果不满足条件1,A、B都位于LCA的左子树,那么显然LCA左子树上的节点应该成为LCA。
 
==> ∴ 从根节点开始,对于根节点的左右子树结点都进行如下循环:找左子树,如果存在A或B返回left(值等于结点值);找右子树,如果存在A或B返回right(值等于结点值)。如果对于某一个结点,left和right都是有值的,那么就返回这个结点。
5.2 Demo
TreeNode lowestCommonAncestor(TreeNode root, TreeNode A, TreeNode B) {
    // write your code here
    if(root ==  null || root == A || root == B){
		return root;
	}
	TreeNode left = lowestCommonAncestor(root.left, A, B);
	TreeNode right = lowestCommonAncestor(root.right, A, B);
	if(left && right){
		return root;
	}else{
		left ? return left : return right;
	}
}												
											树和堆(julyedu网课整理)的更多相关文章
- 栈&队列&并查集&哈希表(julyedu网课整理)
		
date: 2018-11-25 08:31:30 updated: 2018-11-25 08:31:30 栈&队列&并查集&哈希表(julyedu网课整理) 栈和队列 1. ...
 - 算法初步(julyedu网课整理)
		
date: 2018-11-19 13:41:29 updated: 2018-11-19 14:31:04 算法初步(julyedu网课整理) 1 O(1) 基本运算 O(logn) 二分查找 分治 ...
 - 用Python来自动刷智慧树网站的网课
		
学校最近让看什么网课,智慧树网站的,太无聊了,写个脚本刷下,这里是用Python+selenium实现的,也可以用js脚本,更简单,但是我这里刚好最近在学python,就顺便练习下,说下有几个点, 1 ...
 - 智慧树刷网课python脚本
		
0x00 写在前面 疫情期间肯定有很多小伙伴需要上网课,但是有些网课我们感觉十分的鸡肋,自己不感兴趣,又必须要学 所以我写了这个刷网课的小程序,一方面是锻炼自己的爬虫技术,另一方面也给同学们节约宝贵的 ...
 - php编写刷网课自助下单系统(第三方支付实例)
		
此项目是由于本人刚刚入门php且在校代刷网课而编写的,由于在上课时间不方便接单,故特意写一个自助下单系统来实现客户自助下单.本项目主要实现以下功能:1.用户下单2.用户支付3.用户通过账号查询订单4. ...
 - 推荐书单(网课)-人生/编程/Python/机器学习-130本
		
目录 总计(130本) 一.在读 二.将读 三.已读 非专业书单(77本) 四.已读 专业书单(53本) 五.已看网课(8个) 六.在看网课 一个人如果抱着义务的意识去读书,便不了解读书的艺术.--林 ...
 - python网课自动刷课程序-------selenium+chromedriver
		
python的强大之处就在于有许多已经写好的功能库提供,这些库强大且易用,对于写一些有特定功能的小程序十分方便. 现在就用pyhton的selenium+谷歌游览器写一个可以自动刷课的程序,以智慧树上 ...
 - 【前端芝士树】Vue.js面试题整理 / 知识点梳理
		
[前端芝士树] Vue.js 面试题整理 MVVM是什么? MVVM 是 Model-View-ViewModel 的缩写. Model代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑. ...
 - 网课应该这么刷(油猴Tampermonkey脚本自动刷课)
		
懒人福利 首先有些人不想学怎么用脚本,满足你们,压缩包解压之后直接登录即可.戳我下载 脚本已经集成好了,登录即可刷课.章节测试还会自动答题呦,正确率高达97%呦. 油猴及脚本安装 油猴的脚本不知可以刷 ...
 
随机推荐
- 1.Concurrent概述
 - 快速了解前端开发HTML的正确姿势
			
摘要:web前端开发(也称为客户端开发)主要是通过html,CSS和JavaScript等前端技术,实现网站在客服端的正确显示及交互功能. 一.web标准介绍 web标准: w3c:万维网联盟组织,用 ...
 - MySQL 10w+数据 insert 优化
			
由于业务原因,遇到了如题所述的业务问题,事务执行时间在30s~50s 不等,效果非常不理想 方案1. jdbc批处理 5w+ 数据测试,分别使用了mybatis insert()()(拼接xml) ...
 - PHP绕过disable_function
			
PHP绕过disable_function 常规绕过 exec exec执行command命令,但是不会输出全部结果,而是返回结果的最后一行. 想得到全部的结果,可以使用第二个参数,让其输出到一个数组 ...
 - Linux MMC 驱动子系统简述(源码剖析)
			
1. Linux MMC 驱动子系统 块设备是Linux系统中的基础外设之一,而 MMC/SD 存储设备是一种典型的块设备.Linux内核设计了 MMC子系统,用于管理 MMC/SD 设备. MMC ...
 - (转载)IO模型
			
本文转载自网络. 如有侵权,请联系处理! 简介 参考<UNIX Network Programming Volume 1, ThirdEdition [Electronic resources] ...
 - Hibernate4.3基础知识1
			
一.Hibernate 开发环境搭建 4.3 1.导包 2.创建hibernate.cfg.xml配置文件 3.创建实体类 4.创建映射文件 实体类名.hbm.xml 配置文件 二.h ...
 - makefile实验四 编译本地的源文件 + 变量的高级主题一
			
<一>编译本地的源文件 + 变量的模式替换 实验代码 root@ubuntu:~/Makefile_Test/5make_test# vim makefile target := t ...
 - 043 01 Android 零基础入门  01 Java基础语法 05 Java流程控制之循环结构 05 do-while循环介绍及应用
			
043 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 05 do-while循环介绍及应用 本文知识点:do-while循环介绍及应用 do-while循 ...
 - 03 以Hello World为例,分析C语言的最小的程序结构
			
C程序主要包含的部分 预处理器指令 函数 变量 语句 & 表达式 注释 C Hello World 实例 如下程序,可以在屏幕输出短句"Hello World" #incl ...