概述
第六章 树的查找和应用
6.1 查找树
概念:中序是排好序的二叉树为查找树
二叉查找法:
#include <stdio.h>
void search(NODE *t,char a,NODE **p_p,NODE **p_q)
{//在查找树t中查找键值为a的结点
*p_p=NULL;
*p_q=t;
if(t==NULL) return ;
while(*p_q!=NULL)
{
if(*p_q->data=a) return;
*p_p=*p_q;
if(*p_q->data<a)
*p_q=*p_q->rchild;
else
*p_q=*p_q->lchild;
}
}
MAX(二叉查找法) =max{1+ λ lambda λk}( λ lambda λk为根结点到结点k的树枝长度)
AVG(二叉查找法)= ∑ T 中 的 k p ( k ) ( 1 + λ sum_{T中的k}p(k)(1+lambda ∑T中的kp(k)(1+λk)
相对使用概率相同时,p(k)为1/n。
int insert(NODE *p_t,char a)
{
}
删除结点操作:把该结点左子树根接到该位置,然后把右子树根接到左子树最右结点上。
在查找树中,查找结点的最大查找时间:
最坏情况:树退化成链,O(n)
最好情况:除了最后一层,树满 O ( log 2 n ) O(log_2n) O(log2n)
6.2 丰满树
定义:除最后一层外,为满二叉树,最后一层没有要求。
丰满查找树:既是丰满,又是查找。
用平分法构造丰满的二叉树:n个结点排好序,取m=(n-1)/2(下取整,丢小数)Km为根,左边为左子树,右边为右子树,然后递归。
AVG(二叉查找法)= log 2 n log_2 n log2n
n个结点的丰满查找树共有 log 2 n log_2 n log2n层,所以MAX(二叉查找法)= log 2 n log_2 n log2n;当退化为线性链表时,MAX(二叉查找法)=n。
6.3 堆和堆排序
堆:拟满树,结点值大于等于左子结点,同时大于等于右子结点。
层次存放数组a[n]中:2i+1<n时有a[i]>=a[2i+1]; 2i+2<n时有a[i]>=a[2i+2]。
先和左子结点值比较,判断是否需要交换,在和右子结点值作比较
void siftdown(int a[],int i,int n)
{
int j;int t;
t=a[i];
while(j=2*i+1<n)
{
if(j<n-1&&a[j]<a[j+1]) j++;//左右子结点最大值下标
if(t<a[j])
{
a[i]=a[j];
i=j;
}
else break;
}
a[i]=t;
}
//堆排序
void heap_sort(int a[],int n)
{
int i;int t;
for(i=(n-2)/2;i>=0;i--)
siftdown(a,i,n);//初始建堆
for(i=n-1;i>0;i--){
t=a[0];
a[0]=a[i];
a[i]=t;
siftdown(a,0,i);//堆调整
}
}
堆排序: O ( n log 2 n ) O(nlog_2 n) O(nlog2n),是不稳定的。
6.4 平衡树
二叉树高度:h(T),空的二叉树高度为 − 1 -1 −1;非空, h ( T ) = m a x ( h ( T l ) , h ( T r ) ) + 1 h(T)=max(h(T_l),h(T_r))+1 h(T)=max(h(Tl),h(Tr))+1。
平衡度: β ( k ) = h ( T k r ) − h ( T k l ) beta(k)=h(T_{kr})-h(T_{kl}) β(k)=h(Tkr)−h(Tkl).右子树高度减去左子树高度。
平衡树:对二叉树中每个结点: ∣ β ( k ) ∣ midbeta(k)mid ∣β(k)∣ ≤ 1 leq1 ≤1.
n个结点的平衡树的树枝的最大长度小于 3 / 2 l o g 2 n 3/2log_2n 3/2log2n.
平衡查找树:既是平衡树,又是查找树。
1.插入:在查找树中插入新结点
2.定位:从被插入结点k沿树枝向上遍历,如果ki的平衡度为2,则确定改组位置
3.改组:中序遍历,得到序列,然后平分法构造产生新的二叉树
6.5 最佳查找树
一般而言,要考虑查找失败和使用概率不同的情况。
给每个结点添加附加指针,即外部结点,用方框表示,区别于原来的内部结点,用圆圈表示。外部结点共有n+1个,也叫失败结点。
外部路径长度 E n E_n En和内部路径长度 I n I_n In关系: E n = I n + 2 n E_n=I_n+2n En=In+2n
结论:由平分法构造出来的丰满查找树为使 I n I_n In达到最小,为 I n = O ( n log 2 n ) I_n=O(nlog_2 n) In=O(nlog2n),AVG= O ( log 2 n ) O(log_2 n) O(log2n)
6.6 Huffman算法
最小外部加权路径长度。优先队列问题。
每次合并权值最小和次小的结点,产生新节点添加到序列中,排序。
信息编码:1.统计各个字母的使用频率,2.生成一棵Huffman树,频率做权值。
译码树:向左分支记为0,向右分支记为1.
6.7 B树
平衡多叉树,键值是排好序的。
m阶B树性质:
(1)子结点个数<=m;
(2)除根和叶子外,每个结点的子结点个数>= ⌈ m / 2 ⌉ lceil m/2 rceil ⌈m/2⌉。
(3)根结点至少有两个子结点,除非它没有子结点。
(4)所有叶子出现在同一层上,而且不带信息。
(5)具有k个子结点的非叶子结点含有k-1个键值。
最后
以上就是辛勤冬日为你收集整理的数据结构-树知识点总结(二)期末复习专用的全部内容,希望文章能够帮你解决数据结构-树知识点总结(二)期末复习专用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复