数据结构-树知识点总结(二)期末复习专用

第六章 树的查找和应用
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 Tkp(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(n\log_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 ) ∣ \mid\beta(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(n\log_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个键值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值