算法导论-12-1-具有相同关键字元素的二叉查找树
来源:互联网 发布:金融互换 知乎 编辑:程序博客网 时间:2024/05/29 17:07
题目:
相同关键字的存在,给二叉查找树的实现带来了一些问题。
a)当用TREE-INSERT将n个具有相同关键字的数据项插入到一棵初始为空的二叉查找树中时,该算法的渐近性能如何?
我们可以对TREE-INSERT做一些改进,即在第5行的前面测试key[z] = key[x],在第11行的前面测试key[z] = key[y]。如果等式成立,我们对下列策略中的某一种加以实现。对每一种策略,请给出将n个具有相同关键字的数据插入一棵初始为空的二叉查找树中的渐近性能(以下的策略是针对第5行的,比较的是z和x的关键字。将x换成y即可用于第11行)。
b)在结点x处设一个布尔标志b[x],并根据b[x]的不同值,置x为left[x]或right[x]。每当插入一个与x具有相同关键字的结点时,b[x]取TRUE或FALSE。
c)在结点x处设置一个列表,其中所有结点都具有与x相同的关键字,并将z插入到该列表中。
d)随机地将置为left[x]或right[x]
思考:
b)每次测试到等式成立时,若b[x]为FLASE,插入到左子树中,b[x]为TRUE时,插入到右子树中,然后将b[x]取反
c)使用一个链表,所有具有相同关键字的结点组成一个链表,结点中的一个指针指向这个链表
d)使用rand()%2随机地决定插入到左子树中还是右子树中
代码
b)
//二叉查找树结点的结构struct node{int key;//关键字int data;//卫星数据bool b;node *left;//左孩子node *right;//右孩子node *p;//父结点node(int x):key(x),data(x),b(0),left(NULL),right(NULL),p(NULL){}};//二叉查找树的结构struct tree{node *root;tree():root(NULL){}};//二叉查找树的插入void Tree_Insert(tree *T, node *z){//找到要插入的位置node *x = T->root, *y = NULL;//若x为空,x是要插入的位置,x的父是z->pwhile(x != NULL){y = x;//等式成立时,由b决定插入到哪个子树if(z->key == x->key){if(x->b == 0)x = x->left;elsex = x->right;//对b取反x->b = !x->b;}else if(z->key < x->key)x = x->left;elsex = x->right;}//修改指针,注意树为空的情况z->p = y;if(y == NULL)T->root = z;else if(z->key == y->key){if(y->b == 0)y->left = z;else y->right = z;y->b = !y->b;}else if(z->key < y->key)y->left = z;else y->right = z;}
c)
//二叉查找树结点的结构struct node{int key;//关键字int data;//卫星数据node *next;//指向具体相同关键字的链表node *left;//左孩子node *right;//右孩子node *p;//父结点node(int x):key(x),data(x),left(NULL),right(NULL),p(NULL),next(NULL){}};//二叉查找树的结构struct tree{node *root;tree():root(NULL){}};//二叉查找树的插入void Tree_Insert(tree *T, node *z){//找到要插入的位置node *x = T->root, *y = NULL;//若x为空,x是要插入的位置,x的父是z->pwhile(x != NULL){y = x;//等式成立时,不继续插入到子树中,而是链入链表中if(z->key == x->key){z->next = x->next;x->next = z;return;}else if(z->key < x->key)x = x->left;elsex = x->right;}//修改指针,注意树为空的情况z->p = y;if(y == NULL)T->root = z;//等式成立时,不是插入到子树中,而是链入链表中else if(z->key == y->key){z->next = y->next;y->next = z;}else if(z->key < y->key)y->left = z;else y->right = z;}
d)
//二叉查找树结点的结构struct node{int key;//关键字int data;//卫星数据node *left;//左孩子node *right;//右孩子node *p;//父结点node(int x):key(x),data(x),left(NULL),right(NULL),p(NULL){}};//二叉查找树的结构struct tree{node *root;tree():root(NULL){}};//二叉查找树的插入void Tree_Insert(tree *T, node *z){//找到要插入的位置node *x = T->root, *y = NULL;//若x为空,x是要插入的位置,x的父是z->pwhile(x != NULL){y = x;//若等式成立,随机地决定插入到哪个子树中if(z->key == x->key){if(rand()%2 == 0)x = x->left;elsex = x->right;}else if(z->key < x->key)x = x->left;elsex = x->right;}//修改指针,注意树为空的情况z->p = y;if(y == NULL)T->root = z;else if(z->key == y->key){if(rand()%2 == 0)x = x->left;elsex = x->right;}else if(z->key < y->key)y->left = z;else y->right = z;}
- 算法导论-12-1-具有相同关键字元素的二叉查找树
- 《算法导论》二叉查找树的实现
- 二叉查找树 (算法导论12)
- 经过AVL单旋转,任意二叉查找树T1可以变换成另一颗(具有相同关键字的)查找树T2
- 《算法导论》第12章 二叉查找树 (1)遍历
- 算法导论 二叉查找树
- 二叉查找树的元素删除算法
- 二叉查找树相关算法实现(算法导论12章)
- 【算法导论】二叉查找树的操作C++实现
- 算法导论上二叉查找树的实现java
- 生成N个节点随机二叉查找树的函数 具有从1到N的不同的关键字
- 二叉查找数的实现(算法导论)
- 算法导论代码 第12章 二叉查找树
- 算法导论 第12章 二叉查找树
- 《算法导论》读书笔记之第12章 二叉查找树
- 《算法导论》读书笔记之第12章 二叉查找树
- 《算法导论》笔记 第12章 12.1 二叉查找树
- 算法导论第十二(12)章 二叉查找树
- GLSurfaceView
- wpa_supplicant, wpa_cli用法
- Window7和UBUNTU双系统硬盘安装,UBUNTU安装配置过程
- JAVA面试题解惑系列(七)——日期和时间的处理
- linux基本常用命令
- 算法导论-12-1-具有相同关键字元素的二叉查找树
- 字符串处理工具
- JAVA面试题解惑系列(八)——聊聊基本类型(内置类型)
- 越野车分类
- toString与String.valueOf()
- ASIO—下一代C++标准可能接纳的网络库(2)TCP网络应用
- int转String两种方法比较
- 药物用法拉丁文缩写词
- JAVA面试题解惑系列(九)——继承、多态、重载和重写