二叉树介绍
1.二叉树定义
定义:节点的度最多为2的树型结构
特殊的二叉树:
满二叉树:
每层节点的数量都是2^(i-1) (i>=1)
完全二叉树:
深度为k,有n个节点的二叉树当且仅当其每一个节点都与深度为k的满二叉树中编号从1到n的节点一一对应时,称为完全二叉树
2.二叉树的重要性质:
性质1:二叉树的第i层上至多有2^(i-1) (i>=1)个节点
性质2:深度为h的二叉树中至多含有2^h-1个节点
性质3:若在任意一棵二叉树中,有n0个叶子节点,有n2个度为2的节点,则必有n0=n2+1
性质4:具有n个节点的满二叉树深为log2n+1
性质5:若对一棵有n个节点的完全二叉树进行顺序编号(1≤i≤n),那么,对于编号为i(i≥1)的节点:
当i=1时,该节点为根,它无双亲节点
当i>1时,该节点的双亲节点的编号为i/2。
若2i≤n,则有编号为2i的左节点,否则没有左节点
若2i+1≤n,则有编号为2i+1的右节点,否则没有右节点
3.二叉树的操作:
构建、销毁、遍历、高度、密度、插入、删除、查询、求左、求右、求根
4.二叉树的遍历(重点)
前序:根、左、右
中序:左、根、右
后序:左、右、根
注意:前中后由根节点决定,并且左右子树的遍历顺序不会改变
注意:根据 前序+中序 或者 后序+中序 就可以还原一棵树,只有 前序+后序(无法判断根节点的左右子树是哪些) 是无法还原的
层序:从上到下、从左到右依次遍历一棵树,必须与队列配合
5.二叉树的存储:
顺序存储:必须要按照完全二叉树的格式存储,空位置要用特殊的数据补成完全二叉树
数据项:
存储节点的内存
容量
链式存储:由一个个链式节点组成,每个节点就是一棵树
节点数据项:
数据
左子树指针
右子树指针
6.有序二叉树
左子树的数据小于根,右子树的数据大于等于根,这种树称为有序二叉树、二叉搜索树、二叉排序树
注意:这种树的节点需要频繁地插入、删除,因此不适合顺序存储
注意:插入、删除都要保证有序
有序二叉树的中序遍历刚好就是从小到大,所以有序二叉树也是一种排序算法,查找又是天然是二分查找,所以经常考
7.线索二叉树:
规律:在n个节点的链式二叉树中必有n+1个空指针域
有序链式二叉树中有很多的空指针,可以让这些指针指向下一个、前一个节点,这样在便利时可以不用递归而可以使用循环遍历,可以提高树的遍历速度
中序线索二叉树节点数据项:
数据
左子树指针
右子树指针
右子树指针标志位 (假表示指向真的右子树,真表示右子树指向下一个节点)
实现过程:
1、构建有序二叉树
2、创建线索
3、通过线索循环遍历二叉树
8.选择树:(胜者树、失者树)
是一种完全二叉树,待比较的数据都存储在最后一层,根节点是根据左右子树其中一个生成,因此根节点是最大或者最小的,选择树的功能是快速地找出最大值或最小值
9.堆:
是一种完全二叉树,不适合链式存储
大顶堆(大根堆):根节点比左右子树大
小顶堆(小根堆):根节点比左右子树小
数据项:
存储数据的内存首地址
容量
数量
操作:创建、销毁、添加、删除、空堆、满堆
堆可以实现优先队列效果
10.平衡二叉树(AVL树)
前提是有序的二叉树,它的左右子树的高度差不超过1,而且它的所有子树也满足这个条件
如果一个有序二叉树呈现接近单支状(类似链表),它的查找效率接近链表,因此只有达到平衡时它的查找效率最高
由于节点的值受限,因此只能通过调整达到有序,而不能进行值的修改
二叉树不平衡的基础原因:
x y
/\ / \
y t1 以y为轴向右旋转 z x
/\ /\ /\
z t2 t3 t4 t2 t1
/\
t3 t4
x x z
/ \ / \ / \
y t1 z t1 y x
/ \ / \ / \ / \
t2 z y t4 t2 t3 t4 t1
/ \ / \
t3 t4 t2 t3
以z为轴向左旋转
x x z
/ \ / \ / \
t1 y t1 z x y
/ \ / \ / \ / \
z t2 t3 y t1 t3 t4 t2
/ \ / \
t3 t4 t4 t2
以z为轴右旋
11.红黑树:
也是一种自平衡的树,它不是根据子树的高度差来调整平衡,而是给节点设置一种颜色,来达到平衡
红黑树的特性:
1、每个节点或者是黑色、或者是红色
2、根节点必须是黑色
3、每个叶子节点(NULL)是黑色
4、如果一个节点是红色,则它的子节点必须是黑色
不能有两个连续的红色节点
5、从一个节点到该节点的所有子孙节点的所有路径上包含了相同数量的黑色节点
保证大致上红黑树平衡的(最长路径不超过最短路径的两倍)
红黑树插入后的调整:
插入的节点一定是红色
1、如果父节点是黑色,直接插入
2、如果父节点是红色,需要调整
a、叔叔节点不存在 or 叔叔为黑色
进行 左旋 or 右旋
祖父节点置红,父节点置黑
b、叔叔存在且为红色
把祖父置红,父节点和叔叔置黑
把祖父节点当做当前节点,继续向上讨论调整
优点:插入、删除的效率比AVL树高
缺点:没有AVL树平均,查找效率没有AVL树高,但也并不差
12.哈夫曼树:
基本概念:
路径长度:从一个节点到另一个节点之间的路径条目数
根节点到第n层节点的路径长度为n-1
树的路径长度:从根节点出发到每个节点的路径长度之和
节点的权:若将树中节点赋予一个由某种意义的数值,该数值称为该节点的权
节点的带权路径长度:从根节点到该节点路径长度与该节点的权的乘积
树的带权路径长度:所有的叶子节点的带权路径长度之和,称为WPL
WPL是衡量一棵带权二叉树优劣的关键
例子:
成绩: <60 60~69 70~79 80~89 90~100
等级 E D C B A
比例 5% 15% 40% 30% 10%
普通带权二叉树的WPL:51+152+403+304+104=315
哈夫曼树的WPL:40+230+315+410+4*5=205
哈夫曼树的目的是为了生成一棵WPL最小的带权二叉树
构建哈夫曼树:
1、把n个带权节点存入一个集合F中,把每个节点左右子树置空
2、从F中选取权值最小的两个节点作为左右子树构建成一棵新的二叉树,且新的根节点的权为左右子树的权值之和
3、从F中删除刚刚选出来的两个节点,把新得到的根节点放入F中
4、重复2,3步骤,直到F中只剩下一棵树,既是哈夫曼树