一文理解完美二叉树, 完全二叉树和完满二叉树
本文出处:http://www.cnblogs.com/idorax/p/6441043.html
树在数据结构中占有非常重要的地位。本文从树的基本概念入手,给出完美(Perfect)二叉树,完全(Complete)二叉树和完满(Full)二叉树的区别。如果学习过二叉树,但是对这三种二叉树并没有深入的理解,或者完全被国产数据结构教科书所误导(只听说过满二叉树和完全二叉树)的朋友不妨花点时间耐着性子将本文仔细阅读N(>=1)遍。
1. 树(Tree)的基本概念
1.1 树的定义
A tree is a (possibly non-linear) data structure made up of nodes or vertices
and edges without having any cycle. The tree with no nodes is called the null
or empty tree. A tree that is not empty consists of a root node and potentially
many levels of additional nodes that form a hierarchy.
树是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构。没有结点的树称为空(null或empty)树。一棵非空的树包括一个根结点,还(很可能)有多个附加结点,所有结点构成一个多级分层结构。
[注:本文将node一律译为”结点”(而不是”节点”),因为joint或connection是节点,而node是结点。关于”结点”与”节点”请自行搜索浙江大学陈水福教授的文章–“360度”解读如何正确应用”结点”与”节点”]
例如: 【图片来源: https://upload.wikimedia.org/wikipedia/commons/f/f7/Binary_tree.svg】
A simple unordered tree; in this diagram, the node labeled 7 has two children,
labeled 2 and 6, and one parent, labeled 2. The root node, at the top,
has no parent. 上图是一棵无序的树示例。在上图中,标号为7的结点有两个孩子,分别是标号为2和6的结点。
根结点,在最顶端,它没有双亲。
1.2 树的基本术语
Root | The top node in a tree. | 根 | 树的顶端结点 |
---|---|---|---|
Child | A node directly connected to another node when moving away from the Root. | 孩子 | 当远离根(Root)的时候,直接连接到另外一个结点的结点被称之为孩子(Child); |
Parent | The converse notion of a child. | 双亲 | 相应地,另外一个结点称为孩子(child)的双亲(parent)。 |
Siblings | A group of nodes with the same parent. | 兄弟 | 具有同一个双亲(Parent)的孩子(Child)之间互称为兄弟(Sibling)。 |
Ancestor | A node reachable by repeated proceeding from child to parent. | 祖先 | 结点的祖先(Ancestor)是从根(Root)到该结点所经分支(Branch)上的所有结点。 |
Descendant | A node reachable by repeated proceeding from parent to child. | 子孙 | 反之,以某结点为根的子树中的任一结点都称为该结点的子孙(Ancestor)。 |
Leaf | A node with no children. | 叶子(终端结点) | 没有孩子的结点(也就是度为0的结点)称为叶子(Leaf)或终端结点。 |
Branch | A node with at least one child. | 分支(非终端结点) | 至少有一个孩子的结点称为分支(Branch)或非终端结点。 |
Degree | The number of sub trees of a node. | 度 | 结点所拥有的子树个数称为结点的度(Degree)。 |
Edge | The connection between one node and another. | 边 | 一个结点和另一个结点之间的连接被称之为边(Edge)。 |
Path | A sequence of nodes and edges connecting a node with a descendant. | 路径 | 连接结点和其后代的结点之间的(结点,边)的序列。 |
Level | The level of a node is defined by 0 + (the number of connections between the node and the root). | 层次 | 结点的层次(Level)从根(Root)开始定义起,根为第0层,根的孩子为第1层。以此类推,若某结点在第i层,那么其子树的根就在第i+1层。 |
Height of node | The height of a node is the number of edges on the longest path between that node and a leaf. | 结点的高度 | 结点的高度是该结点和某个叶子之间存在的最长路径上的边的个数。 |
Height of tree | The height of a tree is the height of its root node. | 树的高度 | 树的高度是其根结点的高度。 |
Depth of node | The depth of a node is the number of edges from the tree’s root node to the node. | 结点的深度 | 结点的深度是从树的根结点到该结点的边的个数。 (注:树的深度指的是树中结点的最大层次。) |
Forest | A forest is a set of n ≥ 0 disjoint trees. | 森林 | 森林是n(>=0)棵互不相交的树的集合。 |
2 二叉树(Binary Tree)
2.1 什么是二叉树(Binary Tree)
每个结点至多拥有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。
2.2 二叉树的性质
(1)若二叉树的层次从0开始,则在二叉树的第i层至多有2^i个结点(i>=0)。
(2)高度为k的二叉树最多有2^(k+1) - 1个结点(k>=-1)。 (空树的高度为-1)
(3)对任何一棵二叉树,如果其叶子结点(度为0)数为m, 度为2的结点数为n, 则m = n + 1。
2.3 完美二叉树(Perfect Binary Tree)
A Perfect Binary Tree(PBT) is a tree with all leaf nodes at the same depth.
All internal nodes have degree 2.
一个深度为k(>=-1)且有2^(k+1) - 1个结点的二叉树称为完美二叉树。 (注: 国内的数据结构教材大多翻译为”满二叉树”)
例如:
2.4 完全二叉树(Complete Binary Tree)
A Complete Binary Tree (CBT) is a binary tree in which every level,
except possibly the last, is completely filled, and all nodes
are as far left as possible.
换句话说,完全二叉树从根结点到倒数第二层满足完美二叉树,最后一层可以不完全填充,其叶子结点都靠左对齐。
例如:
2.5 完满二叉树(Full Binary Tree)
A Full Binary Tree (FBT) is a tree in which every node other than the leaves has two children.
- 1
换句话说,所有非叶子结点的度都是2。(只要你有孩子,你就必然是有两个孩子。)
**注:**Full Binary Tree又叫做Strictly Binary Tree。
例如:
2.6 完美(Perfect)二叉树 v.s. 完全(Complete)二叉树
(1) 一棵完美(Perfect)二叉树看起来是这个样儿的, 【图2.6.1】
(2) 那么,将编号为15, 14, …, 9的叶子结点从右到左依次拿掉或者拿掉部分,则是一棵完全(Complete)二叉树,
例如,将上图中的编号为15, 14, 13, 12, 11叶子结点都拿掉(从右到左的顺序), 【图2.6.2】
(3) 下图就不是一棵完全(Complete)二叉树,【图2.6.3】,
如果将编号11(K)结点从编号6(E)的左儿子位置移动到编号5(E)的右儿子位置,则变成一棵完全(Complete)二叉树。
注: 图2.6.1, 2.6.2和2.6.3均来自:http://alrightchiu.github.io/SecondRound/binary-tree-introjian-jie.html, 但是,其将Full Binary Tree当做就是Perfect Binary Tree, 我认为是不正确的,特此说明。
特别说明: 其实,理解完全(Complete)二叉树可以借助于栈(stack)的思想。 例如,把图2.6.1中的完美(Perfect)二叉树的所有结点按照编号1, 2, 3, …, 15依次入栈(push)。 那么,对栈的每一次出栈(pop)操作后,栈里保存的结点集对应到图2.6.1上去都是一棵完全(Complete)二叉树。
2.7 完全(Complete)二叉树 v.s. 完满(Full)二叉树
【截图来源:http://courses.cs.vt.edu/~cs3114/Fall09/wmcquain/Notes/T03a.BinaryTreeTheorems.pdf】
2.8 完满(Full)二叉树 v.s. 完全(Complete)二叉树 v.s. 完美(Perfect)二叉树
【图片来源: http://www.csie.ntnu.edu.tw/~u91029/BinaryTree2.png】
3. 总结 (下表参考来源)
完美二叉树 | Perfect Binary Tree | Every node except the leaf nodes have two children and every level (last level too) is completely filled. 除了叶子结点之外的每一个结点都有两个孩子,每一层(当然包含最后一层)都被完全填充。 |
---|---|---|
完全二叉树 | Complete Binary Tree | Every level except the last level is completely filled and all the nodes are left justified. 除了最后一层之外的其他每一层都被完全填充,并且所有结点都保持向左对齐。 |
完满二叉树 | Full/Strictly Binary Tree | Every node except the leaf nodes have two children. 除了叶子结点之外的每一个结点都有两个孩子结点。 |
- 完美(Perfect)二叉树一定是完全(Complete)二叉树,但完全(Complete)二叉树不一定是完美(Perfect)二叉树。
- 完美(Perfect)二叉树一定是完满(Full)二叉树,但完满(Full)二叉树不一定是完美(Perfect)二叉树。
- 完全(Complete)二叉树可能是完满(Full)二叉树,完满(Full)二叉树也可能是完全(Complete)二叉树。
- 既是完全(Complete)二叉树又是完满(Full)二叉树也不一定就是完美(Perfect)二叉树。
一文理解完美二叉树, 完全二叉树和完满二叉树相关推荐
- 树,完美二叉树, 完全二叉树和完满二叉树
树在数据结构中占有非常重要的地位.本文从树的基本概念入手,给出完美(Perfect)二叉树,完全(Complete)二叉树和完满(Full)二叉树的区别.可能会有错误,希望大家多多指正. 1. 树(T ...
- 完美二叉树、完全二叉树、完满二叉树
1.二叉树(Binary Tree) 1.1 什么是二叉树(Binary Tree) 每个结点至多拥有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒. 1 ...
- 二叉树(完美二叉树、完全二叉树、完满二叉树)
二叉树(完美二叉树.完全二叉树.完满二叉树) 树的概念 树的基本术语 二叉树(Binary Tree) 什么是二叉树(Binary Tree) 二叉树的性质 完美二叉树(Perfect Binary ...
- 树、二叉树(完全二叉树、满二叉树)概念图解
1.树的定义 树是n个结点的有限集合,有且仅有一个根结点,其余结点可分为m个根结点的子树. 2.树的概念 结点的度:一个结点拥有子树的个数称为度.比如A的度为3,C的度为2,H的度为0.度为0的结点称 ...
- 二叉树Ⅰ · 树型结构 · 二叉树 · 满二叉树 · 完全二叉树 · 二叉树的性质 · 二叉树的存储
目录 一.树型结构(了解) 1.1 引入和特点 1.2 概念(重要) 1.3 树的表示形式(了解) 二.二叉树(重点) 2.1 概念 2.2 二叉树的基本形态 2.3 两种特殊的二叉树 满二叉树 完全 ...
- 完满(Full)二叉树,完全(Complete)二叉树, 完美(Perfect)二叉树
完美二叉树 Perfect Binary Tree Every node except the leaf nodes have two children and every level (last l ...
- 【数据结构】树 二叉树 满二叉树 完全二叉树初步理解
文章目录 树的相关基本术语 树的表示形式 树结构典型应用场景 二叉树基本概念 满二叉树概念及其性质 完全二叉树的概念和性质 一道完全二叉树的面试题 树的相关基本术语 节点的度:一个节点含有的子树的个数 ...
- 一文理解CatBoost!
1. CatBoost简介 CatBoost是俄罗斯的搜索巨头Yandex在2017年开源的机器学习库,是Boosting族算法的一种.CatBoost和XGBoost.LightGBM并称为GBDT ...
- 完全二叉树与满二叉树
去笔试了很多次,每次都有有关于二叉树的题目,而且其中最多的是关于完全二叉树,然而完全二叉树在哥心中的形态一直很模糊,究其原因是我把完全二叉树和满二叉树搞混了.其实满二叉树是完全二叉树的特例,因为满二叉 ...
- 【algods】4.树和二叉树、完全二叉树、满二叉树、二叉查找树、平衡二叉树、堆、哈夫曼树、散列表...
本博客内容耗时4天整理,如果需要转载,请注明出处,谢谢. 1.树 1.1树的定义 在计算机科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结 ...
最新文章
- Invoker 2019CCPC秦皇岛站I题 简单DP
- 陶大程院士:深度学习“泛化”理论的回顾与前沿
- SAP Ariba——全球最大的采购服务平台
- geyser学习记录(day1):将任务拆分的架构
- Bootstrap插件
- Centos上虚拟机搭建
- 挖孔屏设计!Moto G8高清渲染图曝光:“奥利奥”摄像头消失
- WSO2 WSF/CPP 网络服务开发例子1--HELLO
- BZOJ1565 [NOI2009]植物大战僵尸(拓扑排序 + 最大权闭合子图)
- Python深度学习三剑客,你集齐了吗?
- SQLyog客户端使用教程
- 不同维度、元素的容器vector初始化自定义(C++)
- 总结:服务网格(Service Mesh)
- Python-Pyecharts画图(饼图,雷达图,词云)[二]
- 小狼的单身情话之HTML网页标签和段落的初级教学
- 总谐波失真(THD)的定义
- “狼来了”的VR风,占领不了的客厅
- iOS 播放沙盒视频
- win10商店打不开_win10应用商店闪退是咋回事呢
- 【无标题】第一章:进入丰富多彩的计算机世界(一部分)
热门文章
- 计算机中被选中会是什么颜色,举例详解使用photoshop cc 2017改变图片中被选中区域的颜色-网络教程与技术
-亦是美网络...
- RabbitMQ连接超时问题
- 《Cocos Creator游戏实战》实现微信小游戏排行榜
- matlab二项式,动态规划 – 计算二项式系统 —MATLAB代码 – 算法网
- O2O新猜想:如果商家这样做,还需要团购平台吗
- win10卸载软件通过控制面板
- fcpx快速添加字幕 | final cut pro导入fcpxml字幕文件与视频时间对不上?我用代码搞定了
- 1553B总线基础知识
- WKwebview弹框报错Attempt to present UIAlertController on XXwhich is already presenting (null)
- 七夕节,我用代码制作了表白信封