4.5二叉树的应用之二叉排序树、二叉平衡树、哈夫曼树

1.二叉排序树(BST)

二叉排序树是一个递归的数据结构;对二叉树的中序遍历结果为顺序小到大序列;

二叉排序树的目的不是为了排序,而是为了提高查找(有序)、和删除关键字(树型结构)的速度

特点:左子树<根节点<右子树

1.构造一颗二叉排序树

bool create_BST(BiTree &T,Elem *elem_list,int n){//不同顺序插入,则树可能不同;
    T=NULL;
    for(int i=0; i

2.二叉排序树的查找

//非递归
BSTNode *BST_search(BiTree T,ElemType key,BSTNode *&p){
//p=NULL;//记录查找到的结点的父结点;
while(T!=NULL&&T->data!=key){
        p=T;//记录查找到的结点的父结点;
        if(key < T->data) T=T->lchild;
        else T=T->rchild;
}
return T;//若未找则NULL
}
//递归
BSTNode search(BiTree T,ElemType key){
    if(T==NULL) return NULL;
    if(key==T-data) return T;
    else if(key<T->data) return search(T->lchild,key);
else if(key > T->data) return search(T->rchild,key);
}

二叉排序树的算法的查找递归算法简单但执行效率低(存在重复比较结点);

3.二叉排序树的插入

二叉排序树是动态集合,插入元素需查找到适合位置,可能会改变部分结构;

若规定不存在有相同关键字结点,插入思想,1)若根为空则插入 2)插入元素小于当前结点,则插入左子树;3)插入元素大于当前结点,则插入右子树;

特点:插入的结点一定是叶子结点;

bool insert(BiTree &T,Elem key){
    if(T==NULL) {//递归到空结点插入,故插入后一定为叶子结点;
    	T=newNode(key);//newNode():malloc开辟一个结点内存,左右子树NULL,key赋值
    	return true;
    }
    if(key < T->data) return insert(BiTree &T,key);
    else if(key > T->data) ireturn nsert(BiTree &T,key);
    else return false;//相等则失败
}

3.二叉树排序树的删除

删除的三种情况;

1)删除的结点无左右子树,即该结点为叶子结点,则直接删除,不会改变二叉排序树的特性;

2)删除的结点只有一颗子树左或右,则让子树直接替换该结点;

3)删除的结点有两颗子树,找到该节点中序排序的后继结点结点或前驱结点,将删除结点子树下所有结点BST_insert()新插入该节点,以替换后的结点为根节点,create_BST();,取前驱或后继后结果不唯一(?是否考点)

4.二叉排序树的查找效率分析;(重)

平均查找长度:累和当前层数*该层个数/树的结点个数;

二叉排序树的平均查找长度为二叉排序树的高度:O(H);若这个排序树单侧排序则有n层则平均查找长度为O(n);

若二叉排序树的左右子树高度差不超过1,即二叉平衡树的平均查找长度O(log_2{n})

2.二叉平衡树

平衡二叉树,左右子树高度差不超过1的二叉排序树;简称,AVL;

注:定义左右子树高度差为该树的平衡因子,那么平衡二叉树的平衡因子只能为,-1、0、1

1.平衡二叉树的插入

4种情况

1)LL平衡旋转(右单旋转)

2)RR平衡旋转(左单旋转)

3)LR平衡旋转(先左后右双旋转)

4)RL平衡旋转(先右后左双旋转)

2.平衡二叉树的查找

平衡二叉树的平衡查找长度为O(log_2{n})

3.哈夫曼树

一片详细博文huffmanTree和huffmanCode:https://blog.csdn.net/lin1094201572/article/details/86566877

结点所带权值和路径长度之累和,WPL,带权路径长度;

n个结点带权的二叉树中,WPL最小的二叉树哈夫曼树,即最优二叉树

1.哈夫曼树的构造

算法思想:

1)U{node}结点集合中选两个则相对当前权值最小的结点,放入V集合,两个结点构造一个新的结点为new,结点为左右结点的权值之和,且默认左小右大原则;

2)从U-V+new中选取当前最小两个结点,结合构成新的结点new,权值为左右子和;满足左结点小右结点大原则,从U-V中选取出的结点加入V;

重复2)直至U-V为空;

哈夫曼树的特点:

1)权值越小的点到根结点的路劲越长;

2)构造过程共新建了n-1个几点,故总结点个数为2n-1,其中叶子结点为n个;

3)哈夫曼树不存在度为1的结点;

2.哈夫曼编码,可用于压缩数据;默认左0右1;但没有明确规定;

左右结点的顺序是任意的,故哈夫曼树不唯一,但是最优的,wpl最小;

你可能感兴趣的:(Data,Structure,C/C++,考研前的专业知识梳理)