二叉树
来源:互联网 发布:知乎 天使投资人 编辑:程序博客网 时间:2024/06/09 22:14
二叉树是一种比较常见的树,其加在树上的限制是树的度为2。每个节点的两棵子树分别为其左子树和右子树。
一、基本概念
1.1 二叉树的性质
二叉树的度为2,它具有如下性质:
- 一棵非空二叉树的第i 层上最多有2i-1 个节点(i≥1)
- 一棵深度为k 的二叉树中,最多具有2k-1 个节点
- 对于一棵非空的二叉树,如果叶子节点数为n0,度数为2 的节点数为n2,则有:n0=n2+1。
- 证明设n 为二叉树的节点总数,n1 为二叉树中度为1 的节点数,则有:
- n=n0+n1+n2
- 在二叉树中,所有节点之间的关系用一条边表示,假设树中边的数目为X。根据前驱关系,除根节点外,所有其它节点都有唯一的前驱,所以
- X=n-1
- 根据后继关系所有边都由度为1 和度为2 的节点发出所以
- B=n1+2 * n2
- 所以可得
- n0=n2+1
- 具有n 个节点的完全二叉树的深度k 为“[log2n]向下取整+1”。
1.2 满二叉树
如果一棵二叉树除了最后一层无任何子节点外,每一层上的所有节点都有两个子节点,则该二叉树就是一棵满二叉树。满二叉树的所有叶子都在最后一层,且深度为k的满二叉树具有2k-1 个节点。
下图即为一棵满二叉树:
1.3 完全二叉树
如果一棵二叉树满足以下性质,则它是一棵完全二叉树:对于具有n 个节点的二叉树,如果按照从上至下和从左到右的顺序对二叉树中的所有节点从1 开始顺序编号,则对于任意的序号为i 的节点,有:
- 如果i>1,则序号为i 的节点的父节点的序号为i/2;如果i=1,则序号为i 的节点是根节点,无父节点。
- 如果2i≤n,则序号为i 的节点的左孩子节点的序号为2i;如果2i>n,则序号为i 的节点无左孩子。
- 如果2i+1≤n,则序号为i 的节点的右孩子节点的序号为2i+1;如果2i+1>n,则序号为i 的节点无右孩子。
二、二叉树的基本操作
对于树的操作主要包括添加节点、删除节点、遍历节点。其它操作都可以在这几个操作的基础上进行,比如求树的深度、查找某个节点都可以在遍历的基础上进行,创建树实际上即为往一棵空树中添加节点。
2.1 添加
在往树中添加节点时,如果树为空,则添加的新的节点将成为树的根节点(也是该树的当前的唯一的叶子节点),如果树不为空,则取决于所采取的策略,可能递归的往根的左子树或者右子树添加,最终的结果是使得新节点成为原树中某个叶子的子树,新节点成为树的一个新的叶子,而它所添加到的那个原树的叶子节点成为一个新的非叶子节点。下图即为一个例子:
2.2 删除节点
相对于添加节点,删除节点要稍微复杂些,因为删除的节点可能是不同的角色。
- 如果删除的是一个叶子节点,直接删除即可
- 如果删除的不是叶子节点,并且
- 如果该节点有左孩子(右孩子),但是没有右孩子(左孩子),则将该节点删除,同时将其左孩子(右孩子)提到该节点所处的位置(即使得被删除节点的左(右)孩子成为其父节点的左孩子或者右孩子,是左孩子还是右孩子取决于被删除节点在其父节点的孩子中的位置)
- 如果该节点既有左孩子节点也有右孩子节点,假设该节点为A,其左孩子为B,右孩子为C,则将节点A删除,同时将B提到该节点的位置,并将节点C当做B的右孩子;或者将节点A删除,同时将C提到该节点的位置,并将节点B当做C的左孩子
下图为删除节点前的二叉树:
下图为删除节点21后的树
2.3 遍历树
除了先根遍历、后根遍历和层次遍历之外,二叉树的遍历还有一种中根遍历。中根遍历也可以采用递归算法,其算法描述如下:
- 如果存在左子树,则递归的遍历其左子树
- 访问根节点
- 如果存在右子树,则递归的遍历其右子树
三、哈夫曼树
给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。
3.1 基本概念
3.1.1 路径和路径长度
在一棵树中,从一个节点到其子孙节点所经过的通路称为路径。通路中边(即节点之间连接线)的数目称为路径长度。显然从根节点到第L层节点的路径长度为L-1。3.1.2 节点的权及带权路径长度
给树的节点赋予一个含有某种意义的数值,该数值就称为该节点的权。节点的带权路径长度为:从根节点到该节点之间的路径长度与该节点的权的乘积。3.1.3 树的带权路径长度
树的带权路径长度为所有叶子节点的带权路径长度之和,记为WPL。3.2 哈夫曼树的构造
哈夫曼提出了构造最优二叉树的算法,因此最优二叉树又称为哈弗曼树。假设有n个权值 w1、w2、…、wn,则构造出的哈夫曼树有n个叶子节点,相应的算法如下:- 将w1、w2、…,wn看成是有n 棵二叉树(每棵树仅有一个结点);
- 从二叉树的集合中选出两个根节点的权值最小的树,将它们合并为一棵新的二叉树。这两个节点分别为新的二叉树的左、右子树,且新树的根节点的权值为其左、右子树根节点权值之和
- 重复第2步,直到只剩一棵树为止,该树即为所求得的哈夫曼树
- 二叉树、二叉堆
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 二叉树
- 程序猿的自我修养--链接、装载于库开头
- 50种制作图表JS库
- AVL树—平衡二叉查找树
- restrict
- Extjs4---Uncaught TypeError: Cannot call method 'hasOwnProperty' of undefined
- 二叉树
- 如何读取txt文件内容
- 【OpenGL游戏开发之一】MAC OS X And Win7 vs2010 搭建OpenGL
- Android NDK 提供的交叉工具链手动编译源码
- HDU 1548 BFS 基础题
- Six_Training
- 二值形态学操作、图像的边缘检测、图像编码
- UVa 457 Linear Cellular Automata (water ver.)
- HDU--3068 最长回文 HDU(146)