(1.2.5.4)二叉排序树=二叉搜索树
来源:互联网 发布:当当和淘宝买书哪个好 编辑:程序博客网 时间:2024/04/28 23:51
1.二叉排序树的概念:
二叉排序树是一种动态树表。二叉排序树的定义:二叉排序树或者是一棵空树,
或者是一棵具有如下性质的二叉树:
⑴ 若它的左子树非空,则左子树上所有结点的值均小于根结点的值;
⑵ 若它的右子树非空,则右子树上所有结点的值均大于根结点的值;
⑶ 左、右子树本身又各是一棵二叉排序树。二叉排序树的性质: 按中序遍历二叉排序树,所得到的中序遍历序列是一个递增有序序列
2.二叉排序树的插入:
在二叉排序树中插入新结点,要保证插入后的二叉树仍符合二叉排序树的定义。
插入过程:若二叉排序树为空,则待插入结点*S作为根结点插入到空树中;
当非空时,将待插结点关键字S->key和树根关键字t->key进行比较,
若s->key = t->key,则无须插入,若s->key< t->key,则插入到根的左子树中,
若s->key> t->key,则插入到根的右子树中。而子树中的插入过程和在树中的插入过程相同,
如此进行下去,直到把结点*s作为一个新的树叶插入到二叉排序树中,或者直到发现树已有相同关键字的结点为止。
- void bst_insert(struct bst_node **root, struct bst_node *new)
- {
- if (*root == NULL) {
- *root = new;
- } else {
- if (new->key < (*root)->key) {
- bst_insert(&(*root)->left, new);
- } else {
- bst_insert(&(*root)->right, new);
- }
- }
- }
3. 二叉排序树生成:
从空的二叉排序树开始,经过一系列的查找插入操作以后,生成了一棵二叉排序树。
说明:
① 每次插入的新结点都是二叉排序树上新的叶子结点。
② 由不同顺序的关键字序列,会得到不同二叉排序树。
③ 对于一个任意的关键字序列构造一棵二叉排序树,其实质上对关键字进行排序。
4. 二叉排序树的查找:
在二叉排序树中进行查找的过程和二分查找类似,也是一个逐步缩小查找范围的过程。若查找成功,则是走了一条从根结点到待查结点的路径;若查找失败,则是走了一条根结点到某个叶子结点的路径。因此,查找过程中和关键字比较的次数不超过树的深度。
由于含有n个结点的二叉排序树不唯一,形态和深度可能不同。故含有n个结点的二叉排序树的平均查找长度和树的形态有关。
最好的情况是: 二叉排序树和二叉判定树形态相同。
最坏的情况是: 二叉排序树为单支树,这时的平均查找长度和顺序查找时相同。
最坏情况示例
就平均性能而言,二叉排序树上的查找和二分查找相差不大,并且二叉排序树上的插入和删除结点十分方便,无须大量移动结点。
- //查找
- bool BinarySearchTree::search(ElemType data)
- {
- if (!empty())
- {
- BTNode* p = Root;
- while (p)
- {
- if (data == p->data)
- return true;
- else if (data < p->data)
- p = p->lchild;
- else
- p = p->rchild;
- }
- }
- //树空或查找失败
- return false;
- }
假设被删结点是*p,其双亲是*f,不失一般性,设*p是*f的左孩子,下面分三种情况讨论:
⑴ 若结点*p是叶子结点,则只需修改其双亲结点*f的指针即可。
⑵ 若结点*p只有左子树PL或者只有右子树PR,则只要使PL或PR 成为其双亲结点的左子树即可。
⑶ 若结点*p的左、右子树均非空,先找到*p的中序前趋结点*s(注意*s是*p的左子树中的最右下的结点,它的右链域为空),然后有两种做法:
① 令*p的左子树直接链到*p的双亲结点*f的左链上,而*p的右子树链到*p的中序前趋结点*s的右链上。
② 以*p的中序前趋结点*s代替*p(即把*s的数据复制到*p中),将*s的左子树链到*s的双亲结点*q的左(或右)链上。
第一种过程如下:
1。若p有左子树,找到其左子树的最右边的叶子结点r,用该叶子结点r来替代p,把r的左孩子
作为r的父亲的右孩子。
2。若p没有左子树,直接用p的右孩子取代它。
- btree * DelNode(btree *p)
- {
- if (p->lchild)
- {
- btree *r = p->lchild; //r指向其左子树;
- while(r->rchild != NULL)//搜索左子树的最右边的叶子结点r
- {
- r = r->rchild;
- }
- r->rchild = p->rchild;
- btree *q = p->lchild; //q指向其左子树;
- free(p);
- return q;
- }
- else
- {
- btree *q = p->rchild; //q指向其右子树;
- free(p);
- return q;
- }
- }
1。若p有左子树,用p的左孩子取代它;找到其左子树的最右边的叶子结点r,把p的右子树作为r
的右子树。
2。若p没有左子树,直接用p的右孩子取代它。
- btree * DelNode(btree *p)
- {
- if (p->lchild)
- {
- btree *r = p->lchild; //r指向其左子树;
- btree *prer = p->lchild; //prer指向其左子树;
- while(r->rchild != NULL)//搜索左子树的最右边的叶子结点r
- {
- prer = r;
- r = r->rchild;
- }
- if(prer != r)//若r不是p的左孩子,把r的左孩子作为r的父亲的右孩子
- {
- prer->rchild = r->lchild;
- r->lchild = p->lchild; //被删结点p的左子树作为r的左子树
- }
- r->rchild = p->rchild; //被删结点p的右子树作为r的右子树
- free(p);
- return r;
- }
- else
- {
- btree *q = p->rchild; //q指向其右子树;
- free(p);
- return q;
- }
- }
- (1.2.5.4)二叉排序树=二叉搜索树
- 二叉排序树(二叉搜索树)
- 二叉排序树(二叉搜索树)
- 二叉搜索树(二叉排序树)
- 二叉搜索树(二叉排序树)
- 二叉排序树(二叉搜索树)
- 二叉搜索树(二叉排序树)
- 二叉搜索树(二叉排序树)
- 二叉排序树(二叉搜索树)
- 二叉搜索树(二叉排序树)
- 二叉搜索树,二叉排序树
- 二叉排序树/二叉搜索树
- 二叉排序树:HDU3791-二叉搜索树(用指针建立二叉排序树)
- [BinaryTree] 二叉搜索树(二叉查找树、二叉排序树)
- 二叉搜索树 二叉查找树 二叉排序树
- 二叉排序树(二叉搜索、查找树)(BST树)
- 二叉排序树BinarySortTree(二叉搜索树Binary Search Tree)
- 二叉排序树(二叉搜索树,BST)的使用
- js中如何定义json数据
- 黑马程序员——初步认识Objective-C
- FileZilla下载及基本用法
- hdu 3449 有依赖的背包
- 在JSP中使用ckeditor以及使用SpringMVC实现图片上传
- (1.2.5.4)二叉排序树=二叉搜索树
- $.jBox是一个好的提示效果界面,他的几种使用反式为以下几种,
- poj_1840
- BZOJ 1143 [CTSC 2008] 祭祀 (二分图匹配,最小相交路径覆盖)
- 扩展欧几里德算法
- windows下Opencv安装
- POJ-3069-Saruman's Army(Java简单贪心)
- SecureCRT远程连接SecureFX远程上传
- Two Sum