b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

二叉排心查找、插入和删除

电脑杂谈  发布时间:2020-01-14 02:02:00  来源:网络整理

二叉排序树的删除_二叉树的排序_树与二叉树的转换代码

1. 二叉排?strong>

二叉排蠦inary Sort Tree)磺一棵空是带有以下性质的二叉?p>

(1)扔收,杂戍有结点的值均大于它的根节点的值;

(2)扔收,杂戍有结点的值均袋的根结点的值;

(3)滓子手炳叉排谢

二叉排序树的删除_树与二叉树的转换代码_二叉树的排序

(4)没有结点值同样的结点。

二叉排兄称二叉查找蕁ary Search Tree),亦称二叉搜耍通常辅以二叉链表叉排心储存结构。中喧二叉排猩以受到关键字有鞋即一感可以借助构造二叉排猩为有行,构造数程即为对无行排旋程。

2. 查找

当二叉排谢为空时,首先将给定值跟根节点的关键字比较,热砸成功;权值大于根节点的关键字二叉排序树的删除,在纵归查找;权值殆结点的关键字,在右子瘦归查找。

代码:

二叉排序树的删除_树与二叉树的转换代码_二叉树的排序

/* * 在以T为根节点的尸查找与给定值key相同的节点。 * 如果存在返回指厢点的指针,返回空指针。 */BiTree SearchBST1(BiTree T, TElemType key){if (!T)//空书找失败return NULL;else if (key == T->data) //查找成功return T;else if (key < T->data)//在滋续查找return SearchBST1(T->lchild, key);else//在右子侍续查找return SearchBST1(T->rchild, key);}

3. 插入

二叉排星一种动态剩梳构不是一次生成的,而是在查找过程中,当驶存在关键字等于给定值的节点时再进行插入。新插入的节点一定是叶子结点,而且必定是查找不顺利时查找路径上更恒的子灰孩子。重写上室算法,以便查找不成功时,函数可以返回新节点的插入位置。

代码:

/* * 在以T为根节点的尸查找与key相同的节点。 * 形参中,结点F为结点T的父节点,车为NULL。 * 如果存在此节点,返回TRUE,并让*p指厢点; * 如果不存在此节点,返回FALSE,并让*p指弦路径上的更恒。 */bool SearchBST2(BiTree T, BiTree F, TElemType key, BiTree *p){//函数中,只能对*p进行更改,而不能试图设置p的值。//椅尾危尾蔚母谋洳⒉换嵊跋焓挡巍if (!T){//T为空仕时父结点F华NULL,华查找模式上的更恒。//查找失败*p = F;return false;}else if (key == T->data) //查找成功{*p = T;return true;}else if (key < T->data){return SearchBST2(T->lchild, T, key, p);}else{return SearchBST2(T->rchild, T, key, p);}} /* * 在市查找与key相同的节点。 * 如果存在返回FALSE,帆key值插入到剩 */bool InsertBST(BiTree *T, TElemType key){BiTree p, n;if (SearchBST2(*T, NULL, key, &p))return false;else{n = (BiTree)malloc(sizeof(BiNode));n->data = key;n->lchild = NULL;n->rchild = NULL;//注意不要漏礜ULL的情//此时表锚空诗新节点直接座结点。if (!p)*T = n;//key比查找模式上的更恒小,宰的else if (key < p->data){p->lchild = n;}//key比查找路径上的更恒醋的右子else{p->rchild = n;}return true;}}

二叉排序树的删除_树与二叉树的转换代码_二叉树的排序

4. 删除

对于二叉排鞋删除一搞相当于删除有行中的一讣,只要在删除某结点之蝴食些结点,使之再次保持二叉排心特性即可。

假如要删除的结点为*p(p为指香的指针),*p的父节点为*f,不失一般性,假设*p为*f的子结点:

1) 泉叶子节点,由于删除叶子结点不破坏梳构,一需修改f->lchild为空指针即可。

2) 然有谆有右子尸此时即使让PL槐接作为*f的咨。

树与二叉树的转换代码_二叉排序树的删除_二叉树的排序

3) 热有仔右子仕时有两种处理方式:一是先直接让PL为*f的踪令PR为PL子暑右孩子的右子蔐子暑右孩子即为PL子暑瘁点。二是让*p的直接前驱(挥捍?p,然湖叉排行删除它的直接前驱(挥骸?p的直接前驱为PL子暑右孩子,蹿*p;*p的直接邯PR子暑子,蹿*p。

代码:(使用第一种处理方式)

/* * 在以*T为根节点的尸删除与key相同的节点。 * 如果没有此结点返回FALSE。 */bool DeleteBST(BiTree *T, TElemType key){if (!*T)//空书无此节点。return false;else if (key == (*T)->data){Delete(T);return true;}else if (key < (*T)->data){return DeleteBST(&((*T)->lchild), key);}else{return DeleteBST(&((*T)->rchild), key);}} /* * 删除*T指厢点 */bool Delete(BiTree *T){BiTree L;//*T既没有子,又没有右儿子二叉排序树的删除,为叶子结点if (!(*T)->lchild && !(*T)->rchild)*T = NULL;//*T只有右孩子else if (!(*T)->lchild)*T = (*T)->rchild;//*T只有子else if (!(*T)->rchild)*T = (*T)->lchild;//*T既有子,又有右孩子else{L = (*T)->lchild;//L指暇除结点的作//寻找L的更右孩子while (L->rchild)L = L->rchild;//把*T的右子式滓孩子的右子剩L->rchild = (*T)->rchild;//*T的子譚父结点的子树*T = (*T)->lchild;}return true;}

5. 时间复杂度

二叉排朽对于其它数据结构的优势在于查找、插入、删除的时间复杂度较低。含有n搞的二叉排心平均查找长度跟饰态有关。

最坏的情勘先弘的关键字有鞋二叉排兴化为单枝暑度为n,平均查找长度为(n+1)/2。

最好的情傀叉排心形态和折半查找的判断尸,平均查找长度和log2n成正比。

平均性能:随机情楷平均查找长度和logn成正比。P(n)=O(logn)。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-136782-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...