当前位置: 首页 > wzjs >正文

文山网站建设联系电话旺道seo优化软件怎么用

文山网站建设联系电话,旺道seo优化软件怎么用,有关做学校网站的毕业论文,css做的网站不能往下拉6-12 二叉搜索树的操作集 1 题目原文2 思路解析3 代码实现3.1 插入操作3.1.1 递归法3.1.2 迭代法 3.2 删除操作3.2.1 递归法3.2.1 迭代法 3.3 查找操作3.3.1 递归法3.3.2 迭代法 3.4 查找最大值操作3.4.1 递归法3.4.2 迭代法 3.5 查找最小值操作3.5.1 递归法3.5.2 迭代法 4 总结…

6-12 二叉搜索树的操作集

  • 1 题目原文
  • 2 思路解析
  • 3 代码实现
    • 3.1 插入操作
      • 3.1.1 递归法
      • 3.1.2 迭代法
    • 3.2 删除操作
      • 3.2.1 递归法
      • 3.2.1 迭代法
    • 3.3 查找操作
      • 3.3.1 递归法
      • 3.3.2 迭代法
    • 3.4 查找最大值操作
      • 3.4.1 递归法
      • 3.4.2 迭代法
    • 3.5 查找最小值操作
      • 3.5.1 递归法
      • 3.5.2 迭代法
  • 4 总结

1 题目原文

题目链接:6-12 二叉搜索树的操作集

本题要求实现给定二叉搜索树的5种常用操作。

函数接口定义:

BinTree Insert( BinTree BST, ElementType X );
BinTree Delete( BinTree BST, ElementType X );
Position Find( BinTree BST, ElementType X );
Position FindMin( BinTree BST );
Position FindMax( BinTree BST );

其中 BinTree 结构定义如下:

typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{ElementType Data;BinTree Left;BinTree Right;
};

函数 InsertX 插入二叉搜索树 BST 并返回结果树的根结点指针;
函数 DeleteX 从二叉搜索树 BST 中删除,并返回结果树的根结点指针;如果 X 不在树中,则打印一行Not Found 并返回原树的根结点指针;
函数 Find 在二叉搜索树 BST 中找到 X,返回该结点的指针;如果找不到则返回空指针;
函数 FindMin 返回二叉搜索树 BST 中最小元结点的指针;
函数 FindMax 返回二叉搜索树 BST 中最大元结点的指针。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>typedef int ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{ElementType Data;BinTree Left;BinTree Right;
};void PreorderTraversal( BinTree BT ); /* 先序遍历,由裁判实现,细节不表 */
void InorderTraversal( BinTree BT );  /* 中序遍历,由裁判实现,细节不表 */BinTree Insert( BinTree BST, ElementType X );
BinTree Delete( BinTree BST, ElementType X );
Position Find( BinTree BST, ElementType X );
Position FindMin( BinTree BST );
Position FindMax( BinTree BST );int main()
{BinTree BST, MinP, MaxP, Tmp;ElementType X;int N, i;BST = NULL;scanf("%d", &N);for ( i=0; i<N; i++ ) {scanf("%d", &X);BST = Insert(BST, X);}printf("Preorder:"); PreorderTraversal(BST); printf("\n");MinP = FindMin(BST);MaxP = FindMax(BST);scanf("%d", &N);for( i=0; i<N; i++ ) {scanf("%d", &X);Tmp = Find(BST, X);if (Tmp == NULL) printf("%d is not found\n", X);else {printf("%d is found\n", Tmp->Data);if (Tmp==MinP) printf("%d is the smallest key\n", Tmp->Data);if (Tmp==MaxP) printf("%d is the largest key\n", Tmp->Data);}}scanf("%d", &N);for( i=0; i<N; i++ ) {scanf("%d", &X);BST = Delete(BST, X);}printf("Inorder:"); InorderTraversal(BST); printf("\n");return 0;
}
/* 你的代码将被嵌在这里 */

输入样例:

10
5 8 6 2 4 1 0 10 9 7
5
6 3 10 0 5
5
5 7 0 10 3

输出样例:

Preorder: 5 2 1 0 4 8 6 7 10 9
6 is found
3 is not found
10 is found
10 is the largest key
0 is found
0 is the smallest key
5 is found
Not Found
Inorder: 1 2 4 6 8 9

代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB

2 思路解析

    题目要求实现二叉搜索树的 5 种常用操作,其中 插入查找最大值最小值4 种操作没有什么难以理解的,都是直接根据二叉搜索树的性质来的。但是 删除 这个操作比较繁琐,需要注意。
    下面是 删除 操作的算法步骤,其余操作的算法步骤见代码注释。
        1. 寻找待删除的结点,可以直接调用 查找 操作;
        2. 如果没有,则做相应操作,结束;
        3. 如果有,用指针 p 指向该结点,q 指向其父结点:
            3.1 p 是一个叶结点:将 q 的相应儿子指针置为空,并删除 p,结束;
            3.2 p 只有左子树:删除 p,将 p 的位置替换为 p.left
            3.3 p 只有右子树:删除 p,将 p 的位置替换为 p.right
            3.4 p 有左右子树:找到 p 的第一个后继结点 r,删除 p,将 p 的位置替换为 r,将原来的 r 删掉。

3 代码实现

    下面给出递归法和迭代法两种代码实现。

3.1 插入操作

3.1.1 递归法

BinTree Insert(BinTree BST, ElementType X) {if (!BST) {// 空树BST = (BinTree)malloc(sizeof(struct TNode));BST->Data = X;BST->Left = BST->Right = NULL;} else if (X > BST->Data) {// 要插入的值大于根结点的值,往右子树里面插BST->Right = Insert(BST->Right, X);} else if (X < BST->Data) {// 要插入的值小于根结点的值,往左子树里面插BST->Left = Insert(BST->Left, X);}// 当 X == BST->Data 时,是没有执行任何操作的return BST;
}

3.1.2 迭代法

BinTree Insert(BinTree BST, ElementType X) {Position node = (BinTree)malloc(sizeof(struct TNode));node->Data = X;node->Left = node->Right = NULL;if (!BST) {return node;}Position p = BST, q = NULL;while (p && p->Data != X) {q = p;p = p->Data < X ? p->Right : p->Left;}if (q->Data < X) {q->Right = node;} else if (q->Data > X) {q->Left = node;}return BST;
}

3.2 删除操作

    注意删除操作调用了查找最小值操作

3.2.1 递归法

BinTree Delete(BinTree BST, ElementType X) {if (!BST) {// 空树printf("Not Found\n");return NULL;}if (X < BST->Data) {// 如果目标值小于当前结点的值,递归到左子树中删除BST->Left = Delete(BST->Left, X);} else if (X > BST->Data) {// 如果目标值大于当前结点的值,递归到右子树中删除BST->Right = Delete(BST->Right, X);} else {// 找到目标结点if (BST->Left && BST->Right) {// 如果目标结点有两个子结点// 找到右子树中的最小值结点(后继结点)Position tt = FindMin(BST->Right);// 将目标结点的值替换为后继结点的值BST->Data = tt->Data;// 递归删除后继结点BST->Right = Delete(BST->Right, tt->Data);} else {// 如果目标结点只有一个子结点或没有子结点Position temp = BST;if (!BST->Left) {// 只有右子树或没有子结点BST = BST->Right;} else if (!BST->Right) {// 只有左子树BST = BST->Left;}// 释放目标结点的空间free(temp);}}return BST;
}

3.2.1 迭代法

BinTree Delete(BinTree BST, ElementType X) {if (!BST) {// 空树printf("Not Found\n");return NULL;}BinTree p = NULL, t = BST;// 否则,找出目标结点以及其父结点while (t && t->Data != X) {p = t;t = X < t->Data ? t->Left : t->Right;}if (!t) {// 如果没找到,直接返回BSTprintf("Not Found\n");return BST;}// 否则,p指向的就是目标值父结点,t指向目标值// 进一步判断目标值结点的子树情况if (t->Left && t->Right) {// 两棵子树都存在,找目标结点的后继(其右子树的最小值)Position tt = FindMin(t->Right);// 可知tt所指的结点就是目标值的后继结点,显然tt没有左子树// 然后将目标结点的左子树接到后继结点的左子树上tt->Left = t->Left;// 删除目标结点if (!p) {// 如果目标结点就是根结点BST = t->Right;} else {if (p->Left == t) {p->Left = t->Right;} else {p->Right = t->Right;}}} else if (t->Left) {// 只有左子树,直接删掉,其左子树直接接上去if (!p) {// 如果目标结点就是根结点BST = t->Left;} else {if (p->Left == t) {p->Left = t->Left;} else {p->Right = t->Left;}}} else if (t->Right) {// 只有右子树,直接删掉,与左子树同理if (!p) {// 如果目标结点就是根结点BST = t->Right;} else {if (p->Left == t) {p->Left = t->Right;} else {p->Right = t->Right;}}} else {// 叶结点,直接释放空间,同时别忘了置空if (!p) {// 如果目标结点就是根结点BST = NULL;} else {if (p->Left == t) {p->Left = NULL;} else {p->Right = NULL;}}}// 释放空间free(t);return BST;
}

3.3 查找操作

3.3.1 递归法

Position Find(BinTree BST, ElementType X) {if (!BST) {return NULL;}return X == BST->Data  ? BST: X < BST->Data ? Find(BST->Left, X): Find(BST->Right, X);
}

3.3.2 迭代法

Position Find(BinTree BST, ElementType X) {Position p = BST;while (p && p->Data != X) {p = X < p->Data ? p->Left : p->Right;}return p;
}

3.4 查找最大值操作

3.4.1 递归法

Position FindMax(BinTree BST) {if (!BST || !BST->Right) {return BST;}return FindMax(BST->Right);
}

3.4.2 迭代法

Position FindMax(BinTree BST) {Position p = BST;while (p && p->Right) {p = p->Right;}return p;
}

3.5 查找最小值操作

    和查找最大值操作类似

3.5.1 递归法

Position FindMin(BinTree BST) {if (!BST || !BST->Left) {return BST;}return FindMin(BST->Left);
}

3.5.2 迭代法

Position FindMin(BinTree BST) {Position p = BST;while (p && p->Left) {p = p->Left;}return p;
}

4 总结

    实际上在删除二叉搜索树结点的时候可以有很多种操作的方法,比如可以取第一个前驱结点替代当前结点而不一定是第一个后继结点等,还可以在删除的时候调整二茶搜索树的某些结构。

http://www.dtcms.com/wzjs/364496.html

相关文章:

  • 专业的网站开发成人培训班有哪些课程
  • 定制高端网站建设今日最新消息新闻
  • 网站主页面设计关键词挖掘站长
  • 当下 如何做网站赚钱市场营销策划书
  • 如何把做的网站变成链接国际新闻最新消息中国
  • c语言可以做网站吗成都建设网官网
  • 一般网站的前台功能模块2021年关键词有哪些
  • 网页商城设计商城网站设计案例seo关键词排名在线查询
  • 苹果网站设计百度打开百度搜索
  • 公安局网站不备案seo是什么岗位简称
  • 制作快递网站域名whois查询
  • 网站查询域名访问seo诊断优化专家
  • 企业官网模板下载 简洁现代怎么样优化关键词排名
  • 汉中网站建设报价今日国内热点新闻头条事件
  • 网站新闻更新怎么设计南京seo
  • 怎样做网站链接山东一级造价师
  • 网站开发相关知识郑州seo
  • 珠海工程建设信息网站360关键词排名百度
  • 积极加强网站建设青岛百度快速排名优化
  • 网站建设如何为企业电商化转型赋能网络推广平台收费不便宜
  • 网站使用条款模板百度竞价推广关键词优化
  • wordpress插件地址整站seo排名外包
  • 六安网站开发东莞谷歌推广
  • 山东潍坊新闻seo搜索引擎优化价格
  • 用dreamweaver制作网页的步骤长沙seo优化哪家好
  • 做网站推广logo广州推广排名
  • 青岛网站建设小公司百度指数是怎么计算的
  • 深圳做app网站设计百度广告买下的订单在哪里找
  • 做消防哪些网站找工作广西南宁市有公司网站设计
  • 做设计找参考的设计网站有哪些企业网站seo方案案例