头歌(C语言)-数据结构与算法-查找

构建二叉排序树

任务描述

本关任务:设计出在二叉排序树中插入结点的算法,在此基础上实现构建二叉排序树的算法。

相关知识

实验目的

  1. 掌握顺序表的查找方法,尤其是二分查找方法;
  2. 掌握二叉排序树的建立及查找。

实验任务

说明:查找是软件设计中的最常用的运算,查找所涉及到的表结构的不同决定了查找的方法及其性能。二分查找是顺序表的查找中的最重要的方法,应能充分理解其实现方法和有关性能,并能借助其判定树结构来加深理解。二叉排序树结构在实验时具有一定的难度,可结合二叉树的有关内容和方法来实现。

实验说明

二叉查找树结构及其类型描述

二叉排序树的结构可以和前面二叉树部分完全类似,所不同的是,此处实验中大多以整型数的形式给出的,因此,结构中的元素类型不同,需要注意一下。 二叉排序树结构类型bst的描述如下:

 
  1. struct bnode
  2. {
  3. struct bnode * lchild, rchild;
  4. int data;
  5. };
  6. typedef struct bnode * bst;

具体的库函数可以查看头文件bst.h。

编程要求

请在右侧编辑器的命名空间内填写相关代码,给出一个待插入的序列,实现将序列的每个数字依次插入初始为空二叉排序树的算法。 若题目有其它要求,应当将题目要求的结果在solve函数内通过返回或引用的形式传递参数。

测试说明

平台会对你编写的代码进行测试:

 
  1. 函数说明:
  2. bst solve(vector<int> & a);
  3. 参数 a 为待插入的序列
  4. 返回通过此法构建的二叉排序树根节点
  5. 右侧数据框说明:
  6. 测试输入:
  7. 第一行 1 个整数 n 表示序列的大小
  8. 第二行 n 个整数表示序列里的元素
  9. 实际输出:
  10. 输出你返回的二叉排序树中序遍历的序列
  11. 结构体说明:
  12. struct bnode
  13. {
  14. struct bnode * lchild, rchild;
  15. int data;
  16. };
  17. typedef struct bnode * bst;
  18. 库函数详细可查看右侧头文件 "bst.h"

代码:

#include "bst.h"   
namespace exa {     
bool Insert(bst &bt,int k){
    if(bt==nullptr){
        bt=new bnode;
        bt->data=k;
        bt->lchild=bt->rchild=nullptr;
        return true;
    }
    else if(k==bt->data)
        return false;
    else if(k<bt->data)
        return Insert(bt->lchild,k);
    else
        return Insert(bt->rchild,k);
}


bst solve(vector<int> a) {
    bst bt=nullptr;
    int n=a.size();
    for(int i=0;i<n;i++)
        Insert(bt,a[i]);
    return bt;
}

}

二叉排序树的查找操作

任务描述

本关任务:设计算法在二叉排序树中查找指定值的结点。

相关知识

实验目的

  1. 掌握顺序表的查找方法,尤其是二分查找方法;
  2. 掌握二叉排序树的建立及查找。

实验任务

说明:查找是软件设计中的最常用的运算,查找所涉及到的表结构的不同决定了查找的方法及其性能。二分查找是顺序表的查找中的最重要的方法,应能充分理解其实现方法和有关性能,并能借助其判定树结构来加深理解。二叉排序树结构在实验时具有一定的难度,可结合二叉树的有关内容和方法来实现。

实验说明

二叉查找树结构及其类型描述

二叉排序树的结构可以和前面二叉树部分完全类似,所不同的是,此处实验中大多以整型数的形式给出的,因此,结构中的元素类型不同,需要注意一下。 二叉排序树结构类型bst的描述如下:

 
  1. struct bnode
  2. {
  3. struct bnode * lchild, rchild;
  4. int data;
  5. };
  6. typedef struct bnode * bst;

具体的库函数可以查看头文件bst.h。

编程要求

请在右侧编辑器的命名空间内填写相关代码,设计算法在二叉排序树中查找指定值的结点。 若题目有其它要求,应当将题目要求的结果在solve函数内通过返回或引用的形式传递参数。

测试说明

平台会对你编写的代码进行测试:

 
  1. 函数说明:
  2. bool solve(bst t, int x);
  3. 参数 t 为二叉排序树,参数 x 为待查找的值
  4. 返回一个布尔值表示 x 是否在 t 中
  5. 右侧数据框说明:
  6. 测试输入:
  7. 第一行 1 个整数 n 表示序列的大小
  8. 第二行 n 个整数表示序列里的元素
  9. 第三行 1 个整数 x
  10. 实际输出:
  11. 输出你返回的布尔值
  12. 结构体说明:
  13. struct bnode
  14. {
  15. struct bnode * lchild, rchild;
  16. int data;
  17. };
  18. typedef struct bnode * bst;
  19. 库函数详细可查看右侧头文件 "bst.h"

代码:

#include "bst.h"   
namespace exa {     
bool solve(bst t, int x) {
    if(t==NULL)return false;
    if(t->data==x)return true;
    if(x<t->data)
        return solve(t->lchild,x);
    else
        return solve(t->rchild,x);
}

}

二叉排序树的删除操作

任务描述

本关任务:设计算法在二叉排序树中删除指定值的结点。

相关知识

实验目的

  1. 掌握顺序表的查找方法,尤其是二分查找方法;
  2. 掌握二叉排序树的建立及查找。

实验任务

说明:查找是软件设计中的最常用的运算,查找所涉及到的表结构的不同决定了查找的方法及其性能。二分查找是顺序表的查找中的最重要的方法,应能充分理解其实现方法和有关性能,并能借助其判定树结构来加深理解。二叉排序树结构在实验时具有一定的难度,可结合二叉树的有关内容和方法来实现。

实验说明

二叉查找树结构及其类型描述

二叉排序树的结构可以和前面二叉树部分完全类似,所不同的是,此处实验中大多以整型数的形式给出的,因此,结构中的元素类型不同,需要注意一下。 二叉排序树结构类型bst的描述如下:

 
  1. struct bnode
  2. {
  3. struct bnode * lchild, rchild;
  4. int data;
  5. };
  6. typedef struct bnode * bst;

具体的库函数可以查看头文件bst.h。

编程要求

请在右侧编辑器的命名空间内填写相关代码,设计算法在二叉排序树中删除指定值的结点。 若题目有其它要求,应当将题目要求的结果在solve函数内通过返回或引用的形式传递参数。

测试说明

平台会对你编写的代码进行测试:

 
  1. 函数说明:
  2. void solve(bst & t, int x);
  3. 参数 t 为二叉排序树,参数 x 为待删除的值
  4. 右侧数据框说明:
  5. 测试输入:
  6. 第一行 1 个整数 n 表示序列的大小
  7. 第二行 n 个整数表示序列里的元素
  8. 第三行 1 个整数 x
  9. 实际输出:
  10. 输出 t 的中序遍历序列
  11. 结构体说明:
  12. struct bnode
  13. {
  14. struct bnode * lchild, rchild;
  15. int data;
  16. };
  17. typedef struct bnode * bst;
  18. 库函数详细可查看右侧头文件 "bst.h"

代码:

#include "bst.h"   // 引用库函数文件
namespace exa {     //请在命名空间内编写代码,否则后果自负

void deletel(bst p,bst & r){
    bst q;
    if(r->rchild!=NULL)
        deletel(p,r->rchild);
    else{
        p->data=r->data;
        q=r;
        r=r->lchild;
        delete q;
    }
}

void deletep(bst & p){
    bst q;
    if(p->rchild==NULL){
        q=p;
        p=p->lchild;
        delete q;
    }
    else if(p->lchild==NULL){
        q=p;
        p=p->rchild;
        delete q;
    }
    else deletel(p,p->lchild);
}

void solve(bst & t, int x) {
    if(t!=NULL){
        if(x==t->data){
            deletep(t);
            return;
        }
        else if(x<t->data)
            solve(t->lchild,x);
        else
            solve(t->rchild,x);
    }
    else return;
}

}

以上内容仅供参考哟,大家还需独立完成,巩固知识点^-^

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值