1.二叉排序树(BST)
二叉排序树是一个递归的数据结构;对二叉树的中序遍历结果为顺序小到大序列;
二叉排序树的目的不是为了排序,而是为了提高查找(有序)、和删除关键字(树型结构)的速度;
特点:左子树<根节点<右子树
1.构造一颗二叉排序树
bool create_BST(BiTree &T,Elem *elem_list,int n){//不同顺序插入,则树可能不同; T=NULL; for(int i=0; i<n; i++) { BST_insert(BiTree &T,elem_list[i]);//空则插,小左,大右递归; } //或 T=NULL; int i=0; while(i<n){ BST_insert(BiTree &T,elem_list[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最小;