Code前端首页关于Code前端联系我们

动态搜索 - 二叉排序树和 C 语言代码实现简介

terry 2年前 (2023-09-27) 阅读数 75 #数据结构与算法

1。算法简介

二叉排序树(Binary Sort Tree),也称为二叉搜索树(Binary Search Tree),也称为二叉搜索树。树属于一种输入数据,默认情况下会生成顺序数据结构。这与本章前面的内容中描述的特定数据段内的静态搜索不同。动态搜索是一种会自动对输入的数据结构进行排序,之前写的STL中的集合集合底层就是一个类似树形结构的红黑树。

2。定义

二叉排序树具有以下性质:

a)如果是左子树不空,那么子树左边的所有节点的值都小于或等于其根节点的值;

b) 如果右子树不为空,则右子树上所有节点的值都大于等于其根节点的值;

c) 左子树和右子树分别也是二叉排序树;

也就是说,对于每个根节点,其左子节点始终小于根,其右子节点始终大于根。

3。搜索

请记住,如果树为空,则搜索结束并且没有匹配项。如果查找到的值等于根节点的值,则查找成功。否则,继续寻找子树。如果查找的值小于根节点的值,则选择左子树,如果查找的值大于根节点的值,则选择右子树。

参考代码如下:

typedef int us; /* Status 为函数的类型,其值为函数结果的状态码,如 OK 等 */ /* 二叉树的二叉链表节点结构定义 * /❤int数据; /*节点数据*/ struct BiTNode *lchild, *rchild; / * 左右子指针 */} BiTNode, *BiTree; /* 如果键存在于二叉排序树 T 中,则递归查找,*/* 指针 f 指向T 的父母,T 的父母。初始调用值为NULL *//*如果查找成功,指针p指向数据项节点,返回TRUE *//*否则,指针p指向数据项上最后访问过的节点搜索路径并返回 FALSE */ Status SearchBST(BiTree t, int p, Bi❀❀p) * { if ( !t) /* 搜索失败 * /❀ *p = f; 返回FALSE; ) /* 搜索成功 */ {             
             } 其他 如果 ) > 返回 参见archBST(t->lchild, key, t, p); /* 继续查找左子树 */ else
key, ->SearchBST,(t); /*继续寻找右子树*/}

4.插入方法及实现

二分排序的插入是在二分排序的基础上进行的排序搜索,插入节点就是通过搜索找到节点合适的插入位置,直接将节点插入其中。事实上,2.2节中逐步构建二叉排序树的过程就是节点插入过程。并且考虑到搜索的关键字已经在树中,它指向数据节点。如果搜索的关键字不在树中,则指向搜索路径的最后一个节点。

参考代码

struct BiTree { ❝ data;BiTree *lchild;BiTree *rchild}; //将关键字key插入二叉排序树BiTree* InsertBST(BiTree *t, key){ if t == NULL) =t BiTree() ; t->lchild = t->rchild = NULL; t->data = key; 返回 } if (键 数据) t->lchild =->insertBST( >lchild,); else t->rchild = InsertBST(t->rchild, key); return♼ //数组d中有n个数据,tree 为二叉排序树根 BiTree* CreateBiTree(BiTree *tree, int ❝❝], d[ n){ 对于 (int i =♝ n; i++) ?将来会影响删除树

其他部分的结构时,请考虑以下情况:

a) 删除的节点是叶子节点;

b) 删除的注释只有左子树;

c )删除的节点只有右子树

d)删除的节点既有左子树又有右子树。

参考代码如下:

/*如果二叉排序树T中存在key等于key的数据元素,则删除该数据元素节点,*//*,返回TRUE ;否则返回FALSE。 */状态删除BST(BiTree *T,int key){ { (!*T) /* 不存在 关键字等于密钥的数据元素 { if (key== if (键=- >data) ❝ 键等于键 */                       else (keydata)      return 删除BST(&( *T)->lchild ,key);

                                                ; .*/

状态删除(BiTree *p){ BiTree q,s; ♼ ♼>(❀) child==NULL) / * 如果右子树为空,只需重新连接其左子树即可(要删除的节点如果是叶子,也会走这个分支) */ {      q= *p; *p =(*p)->lchild; 免费(q);}否则 ((*p)- >lchild==NULL) /* 只需连接其再次正确孩子*/ { q=*p; *p=(*p)->rchild; free(q);                                        /*左边的和子树都不是空的 {q=*p; s=(*p)->lchild; while(s->rchild) /* 左转右转结束(查找已删除节点的待定前驱)*/ } (*p)->data=s->data; /* s 指向被删除节点的直接前驱(用被删除节点的前驱值替换被删除节点的值) */ if♼❀(q! * p)  其他q->lchild=s->lchild; /* 重新连接 q 的左子树 */ free(r); 是转 TRUE;}

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门