数据结构与算法之二叉树
二叉树
数组,链表和树的比较
数组的优缺点:
- 优点:通过索引方式访问元素,速度非常快,时间复杂度为O(1)。对于有序数组,还可以使用二分查找来提高查找的速度。
- 缺点:如果要查找某个具体的值,时间复杂度为O(n),如果要在数组中插入某个值(按一定顺序)会整体的移动,效率较低。
链表的优缺点:
- 优点:插入一个值,只需要创建一个节点并将节点链接到链表中即可。
- 缺点:在进行查找时,效率仍然较低,需要从头节点开始遍历,时间复杂度为O(n)。
树的优点:能提高数据存储和读取的效率,比如利用二叉搜索树,既可以保证数据的查找速度,同时也可以保证数据的插入,删除,修改的速度。
树(Tree)
树的常用术语(结合示意图理解):
- 节点:A、B、C、D、E、F、G、H。
- 根节点:A。
- 父节点:B是D和E的父节点。
- 子节点:B是A的子节点。
- 兄弟节点:D和E的父节点都是B、所以D的兄弟节点是E。
- 路径:从一个节点到另一个节点的路线。
- 层数:根节点A在第一层,根节点的子节点B和C在第二层,以此类推(有的教程也从0开始计数)。
- 左子树:节点B和节点B的子节点构成的树称为节点A的左子树。
- 右子树:节点C和节点C的子节点构成的树称为节点A的右子树。
- 森林:多棵子树构成森林。
- 节点的度:子节点或子树的个数。
- 树的度:所有节点中度的最大值。
- 叶子节点:没有子节点的节点,度为0的节点。
- 非叶子节点:度不为0的节点。
- 节点的深度(depth):从根节点到当前节点的唯一路径上的节点总数(包含根节点和当前节点)。
- 节点的高度(height):从当前节点到最远叶子节点的路径上的节点总数(包含当前节点和最远叶子节点)。
- 树的深度:所有节点深度中的最大值。
- 树的高度:所有节点高度中的最大值。
树的基本性质:
- 一棵树可以没有任何节点,为空树。
- 一棵树也可以只有一个节点,也就是根节点。
- 树的深度等于树的高度。
二叉树(Binary Tree)
二叉树:每个节点最多只能有两个子节点的树,也就是每个节点的度最大为2。
二叉树的特点:
- 每个节点的度最大为2,节点的度可以为0、1、2。
- 即使某个节点只有一个子节点,也要区分左右子节点。
二叉树的性质:
- 在非空二叉树的第i层,最多有2^(i-1)个节点(i>=1)。
- 在高度为h的树上,最多有2^h-1个节点(h>=1)。
- 对于任意一棵非空二叉树,如果叶子节点的个数为n0,度为2的节点个数为n2,则有:n0=n2+1。
2^h-1
的推导:
在高度为h的树上,树的高度即为层数,第一层最多有2^0个节点,第二层最多有2^1个节点...第n层最多有2^(h-1)个节点
设S为总节点个数,那么:
S=2^0+2^1+2^2+...+2^(h-1) (公式1)
2S=2*(2^0+2^1+2^2+...+2^(h-1))=2^1+2^2+...+2^h (公式2)
使用公式2减去公式1得出S=2^h-2^0=2^h-1
n0=n2+1
的推导:
已知非空二叉树的叶子节点个数为n0,度为2的节点个数为n2,假设度为1的节点个数为n1,那么有:
树的总节点个树为n=n0+n1+n2
树的边条数为t=n1+2*n2(度为1的节点有一条边,度为2的节点有两条边)=n-1(每个节点头上都有一条边,除了根节点)=n0+n1+n2-1(将上面的n的公式代入)
即有n1+2*n2=n0+n1+n2-1,消除左右公共项,得出n2=n0-1,也就是n0=n2+1
真二叉树(Proper Binary Tree)
真二叉树:所有节点的度要么为0,要么为2。
满二叉树(Full Binary Tree)
满二叉树:最后一层节点的度都为0,其他节点的度都为2。
满二叉树是一棵特殊的真二叉树。
在同样高度的二叉树中,满二叉树的叶子节点数量最多、总节点数量最多。
假设满二叉树的高度为h(h>=1),那么:
- 第i层的节点数量:2^(i−1)。
- 叶子节点数量(也就是最后一层的节点数量):2^(h−1)。
- 总节点数量n=2^h-1,那么h=log2(n+1)。
完全二叉树(Complete Binary Tree)
完全二叉树:二叉树的所有叶子节点都在最后一层或者倒数第二层,而且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续。
完全二叉树从根结点至倒数第2层是一棵满二叉树。
满二叉树是一棵特殊的完全二叉树。
完全二叉树的性质:
- 度为1的节点要么只有一个,要么没有。
- 度为1的节点只有左子节点。
- 同样节点数量的二叉树,完全二叉树的高度最小。
- 假设完全二叉树的高度为h(h>=1),总节点的数量为n,那么有
h=floor(log2(n))+1
。
h=floor(log2(n))+1
的推导:
已知完全二叉树的高度为h(h>=1),总节点的数量为n:
那么总节点数量至少有2^0+2^1+2^2+...+2^(h-1)+1=2^(h-1)个(从根节点到倒数第二层的满二叉树+最后一层一个节点),
最多有2^0+2^1+2^2+...+2^h=2^h-1个(满二叉树),
即2^(h-1)<=n<=2^h-1<2^h
对等式两边取对数得出:h-1<=log2(n)<h
由于h是整数,所以h=floor(log2(n))
floor是向下取整,ceiling是向上取整,另外在计算机中整数的除法默认是向下取整。
一棵有n个节点的完全二叉树(n>0),从上到下、从左到右对节点从1开始进行编号,对任意第i个节点:
- 如果i=1,它是根节点。。
- 如果i>1,它的父节点编号为floor(i/2)。
- 如果2i<=n,它的左子节点编号为2i。
- 如果2i>n ,它无左子节点,也无右子节点。
- 如果2i+1<=n,它的右子节点编号为2i+1。
- 如果2i+1>n,它无右子节点。
一棵有n个节点的完全二叉树(n>0),从上到下、从左到右对节点从0开始进行编号,对任意第i个节点:
- 如果i=0,它是根节点。
- 如果i>0,它的父节点编号为floor(i/2)。
- 如果2i+1<=n–1,它的左子节点编号为2i+1。
- 如果2i+1>n–1,它无左子节点,也无右子节点。
- 如果2i+2<=n–1,它的右子节点编号为2i+2 。
- 如果2i+2>n–1,它无右子节点。
面试题
题目:如果一棵完全二叉树有768个节点,求叶子节点的个数?
答案:768/2=384
假设完全二叉树有n个节点,度为0的节点个数为n0,度为1的节点个数为n1,度为2的节点个数为n2,那么有
n=n0+n1+n2,前面有公式n0=n2+1
即n=n0+n1+n0-1=2n0+n1-1
即n0=(n-n2+1)/2
完全二叉树的n1要么为0,要么为1
当n1为1时,n0=n/2,n一定是偶数
当n1为0时,n0=(n+1)/2,n必然是奇数
总结公式:
n0=floor((n+1)/2)=ceiling(n/2)
n1+n2=floor(n/2)=ceiling((n–1)/2)
更多精彩内容关注本人公众号:架构师升级之路
数据结构与算法之二叉树相关推荐
- 常考数据结构与算法:输出二叉树的右视图
题目描述 请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图 上图树的右视图为:{1,4,3,7} 做此题之前可以先做下面3道题: 1. 常考数据结构与算法:求二叉树的层序遍历 2.常 ...
- 数据结构与算法之二叉树的序列化和反序列化及判断一棵树是否为平衡二叉树
数据结构与算法之二叉树的序列化和反序列化及判断一棵树是否为平衡而二叉树 目录 二叉树的序列化和反序列化 判断一棵树是否为平衡而二叉树 1. 二叉树的序列化和反序列化 1. 递归版本序列化和反序列化 代 ...
- 数据结构与算法之二叉树的先序遍历,中序遍历,后序遍历
数据结构与算法之二叉树的先序遍历,中序遍历,后移遍历 目录 实现二叉树的先序,中序,后序遍历,包括递归方式和非递归方式 在二叉树中找到一个节点的后继节点 1. 实现二叉树的先序,中序,后序遍历,包括递 ...
- 数据结构与算法之-----二叉树(一)
[ 写在前面的话:本专栏的主要内容:数据结构与算法. 1.对于初识数据结构的小伙伴们,鉴于后面的数据结构的构建会使用到专栏前面的内容,包括具体数据结构的应用,所使用到的数据结构,也是自己构建的,未使用 ...
- 数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树
[本文谢绝转载,原文来自http://990487026.blog.51cto.com] 树 数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树二叉树的创建,关系建立二叉树的创建 ...
- 数据结构与算法:二叉树专题
数据结构与算法:二叉树专题 前言 前提条件 基础知识 二叉树链式存储结构 二叉树中序遍历 二叉树层序遍历 常见编程题 把一个有序整数数组放到二叉树中 逐层打印二叉树结点数据 求一棵二叉树的最大子树和 ...
- 数据结构与算法练习-二叉树中序遍历
python数据结构与算法练习-二叉树中序遍历 二叉树中序遍历 思路 python实现 二叉树中序遍历 链接: link. 给定一个二叉树的根节点 root ,返回它的 中序 遍历. 样例 输入:ro ...
- 常考数据结构与算法:求二叉树的层序遍历
题目描述 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该二叉树层序遍历的结果是 [ [3], [9,20], ...
- 数据结构与算法--重建二叉树
二叉树 树在实际编程中经常遇到地一种数据结构.上一篇中我们解释了二叉树及其原理,从中可以知道,树地操作会涉及到很多指针地操作,我们一般遇到地树相关地问题差不多都是二叉树.二叉树最重要地莫过于遍历,即按 ...
- 【数据结构与算法】二叉树
树 1.树.二叉树 2.二叉查找树 3.平衡二叉树.红黑树 4.递归树 一.树 1.树的常用概念 根节点.叶子节点.父节点.子节点.兄弟节点,还有节点的高度.深度以及层数,树的高度. 2.概念解释 节 ...
最新文章
- 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(8) 权限管理,自定义权限,扩展权限...
- C++类的组合和前向引用
- 使用Unity制作的一个望远镜特效,在狙击手游戏中非经常见
- hibernate Restrictions 用法 查询
- git mysql差异备份_结合Git实现Mysql差异备份,可用于生产环境
- java jsp网页计算器_JSP实现计算器功能(网页版)
- xampp 支持pdo mysql_XAMPP PDO Mysql server连接配置
- Nmap简单使用教程
- 行测测评——矩阵、圆形、环形三角图形数列推理解题技巧
- 教学实验平台之三极管放大特性测试
- VS code + miktex + 内置pdf阅读器 配置latex编译环境
- 车辆网相关政策和法律法规
- 最新 EDK2 实验
- mac免费的虚拟机怎么安装?VMware虚拟机免费获取教程
- vue使用vue-video-player播放视频及遇到的问题
- Seagate-保修验证(za25shrx)
- 淘宝越来越重视的内容营销要怎么去做?
- 手机wps怎么设置打印横竖_手机WPS怎么设置横版打印?
- 腾讯地图输入关键字自动补全的应用及遇到的问题详解
- mybatis关系映射之一对多和多对一