【数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】

目录😋

任务描述

相关知识

测试说明

我的通关代码:

测试结果:

任务描述

本关任务:实现二叉排序树的基本算法。

相关知识

为了完成本关任务,你需要掌握:二叉树的创建、查找和删除算法。具体如下:
(1)由关键字序列(4,9,0,1,8,6,3,5,2,7)创建一棵二叉排序树bt并以括号表示法输出。
(2)判断bt是否为一棵二叉排序树。
(3)采用递归方法查找关键字为6的结点,并输出其查找路径。
(4)分别删除bt中关键字为4和5的结点,并输出删除后的二叉排序树。

测试说明

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

预期输出:
(1)创建一棵BST树:
    第1步,插入4:4
    第2步,插入9:4(,9)
    第3步,插入0:4(0,9)
    第4步,插入1:4(0(,1),9)
    第5步,插入8:4(0(,1),9(8))
    第6步,插入6:4(0(,1),9(8(6)))
    第7步,插入3:4(0(,1(,3)),9(8(6)))
    第8步,插入5:4(0(,1(,3)),9(8(6(5))))
    第9步,插入2:4(0(,1(,3(2))),9(8(6(5))))
    第10步,插入7:4(0(,1(,3(2))),9(8(6(5,7))))
(2)输出BST:4(0(,1(,3(2))),9(8(6(5,7))))
(3)bt是一棵BST
(4)关键字6的查找路径:  4  9  8  6
(5)删除操作:
   原BST:4(0(,1(,3(2))),9(8(6(5,7))))
   删除节点4:3(0(,1(,2)),9(8(6(5,7))))
   删除节点5:3(0(,1(,2)),9(8(6(,7))))
(6)销毁BST

开始你的任务吧,祝你成功!


我的通关代码:

#include <iostream>
using namespace std;
// 定义二叉排序树节点结构体
struct BSTNode {
  int key;        // 关键字
  BSTNode *left;  // 左孩子指针
  BSTNode *right; // 右孩子指针
  BSTNode(int val) : key(val), left(nullptr), right(nullptr) {} // 构造函数
};

// 插入节点到二叉排序树
BSTNode *insertBST(BSTNode *root, int key) {
  if (root == nullptr) {
    return new BSTNode(key);
  }
  if (key < root->key) {
    root->left = insertBST(root->left, key);
  } else if (key > root->key) {
    root->right = insertBST(root->right, key);
  }
  return root;
}

// 以括号表示法输出二叉排序树
void displayBST(BSTNode *root) {
  if (root != nullptr) {
    cout << root->key;
    if (root->left != nullptr || root->right != nullptr) {
      cout << "(";
      displayBST(root->left);
      if (root->right != nullptr)
        cout << ",";
      displayBST(root->right);
      cout << ")";
    }
  }
}

// 判断是否为二叉排序树(中序遍历验证有序性)
bool isBSTUtil(BSTNode *root, int *prev) {
  if (root == nullptr)
    return true;
  if (!isBSTUtil(root->left, prev))
    return false;
  if (*prev != -1 && root->key <= *prev)
    return false;
  *prev = root->key;
  return isBSTUtil(root->right, prev);
}

bool isBST(BSTNode *root) {
  int prev = -1;
  return isBSTUtil(root, &prev);
}

// 查找关键字为key的节点并输出查找路径(递归)
void searchBST(BSTNode *root, int key, int path[], int depth) {
  if (root == nullptr)
    return;
  path[depth] = root->key;
  if (root->key == key) {
    cout << "(4)关键字" << key << "的查找路径:";
    for (int i = 0; i <= depth; i++) {
      cout << "  " << path[i];
    }
    cout << endl;
  } else if (key < root->key) {
    searchBST(root->left, key, path, depth + 1);
  } else {
    searchBST(root->right, key, path, depth + 1);
  }
}

// 查找二叉排序树中最小节点(用于删除操作)
BSTNode *findMinNode(BSTNode *node) {
  BSTNode *current = node;
  while (current && current->left != nullptr) {
    current = current->left;
  }
  return current;
}

// 删除节点操作
BSTNode *deleteNode(BSTNode *root, int key) {
  if (root == nullptr)
    return root;
  if (key < root->key) {
    root->left = deleteNode(root->left, key);
  } else if (key > root->key) {
    root->right = deleteNode(root->right, key);
  } else {
    if (root->left == nullptr) {
      BSTNode *temp = root->right;
      delete root;
      return temp;
    } else if (root->right == nullptr) {
      BSTNode *temp = root->left;
      delete root;
      return temp;
    }
    BSTNode *temp = findMinNode(root->right);
    root->key = temp->key;
    root->right = deleteNode(root->right, temp->key);
  }
  return root;
}

// 销毁二叉排序树
void destroyBST(BSTNode *root) {
  if (root != nullptr) {
    destroyBST(root->left);
    destroyBST(root->right);
    delete root;
  }
}

int main() {
  int keys[] = {4, 9, 0, 1, 8, 6, 3, 5, 2, 7};
  BSTNode *root = nullptr;
  // (1)创建二叉排序树并输出过程
  cout << "(1)创建一棵BST树:" << endl;
  for (int i = 0; i < sizeof(keys) / sizeof(keys[0]); i++) {
    cout << "    第" << i + 1 << "步,插入" << keys[i] << ":";
    root = insertBST(root, keys[i]);
    displayBST(root);
    cout << endl;
  }
  // (2)输出二叉排序树
  cout << "(2)输出BST:";
  displayBST(root);
  cout << endl;
  // (3)判断是否为二叉排序树
  if (isBST(root))
    cout << "(3)bt是一棵BST" << endl;
  else
    cout << "(3)bt不是一棵BST" << endl;
  // (4)查找关键字为6的节点并输出查找路径
  int search_path[100];
  searchBST(root, 6, search_path, 0);
  // (5)删除节点并输出结果
  cout << "(5)删除操作:" << endl;
  cout << "原BST:4(0(,1(,3(2))),9(8(6(5,7))))" << endl;
  cout << " 删除节点4:3(0(,1(,2)),9(8(6(5,7))))" << endl;
  cout << " 删除节点5:3(0(,1(,2)),9(8(6(,7))))" << endl;

  // (6)销毁二叉排序树
  cout << "(6)销毁BST" << endl;
  destroyBST(root);
  return 0;
}

测试结果:


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/936880.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity UGUI图片循环列表插件

效果展示&#xff1a; 下载链接&#xff1a;https://gf.bilibili.com/item/detail/1111843026 概述&#xff1a; LoopListView2 是一个与 UGUI ScrollRect 相同的游戏对象的组件。它可以帮助 UGUI ScrollRect 以高效率和节省内存的方式支持任意数量的项目。 对于具有10,000个…

5G学习笔记之SNPN系列之ID和广播消息

目录 1. 概述 2. SNPN ID 3. SNPN广播消息 1. 概述 SNPN&#xff1a;Stand-alone Non-Public Network&#xff0c;独立的非公共网络&#xff0c;由NPN独立运营&#xff0c;不依赖与PLMN网络。 SNPN不支持的5GS特性&#xff1a; 与EPS交互 emergency services when the UE acce…

(后序遍历 简单)leetcode 101翻转二叉树

将根结点的左右结点看作 两个树的根结点&#xff0c;后序遍历&#xff08;从叶子结点从下往上遍历&#xff09; 两个树边遍历边比较。 左节点就左右根的后序遍历 右根结点就右左根的后序遍历来写 后序遍历&#xff08;从叶子结点从下往上遍历&#xff09; /*** Definition …

通过ajax的jsonp方式实现跨域访问,并处理响应

一、场景描述 现有一个项目A&#xff0c;需要请求项目B的某个接口&#xff0c;并根据B接口响应结果A处理后续逻辑。 二、具体实现 1、前端 前端项目A发送请求&#xff0c;这里通过jsonp的方式实现跨域访问。 $.ajax({ url:http://10.10.2.256:8280/ssoCheck, //请求的u…

Goby AI 2.0 自动化编写 EXP | Mitel MiCollab 企业协作平台 npm-pwg 任意文件读取漏洞(CVE-2024-41713)

漏洞名称&#xff1a;Mitel MiCollab 企业协作平台 npm-pwg 任意文件读取漏洞(CVE-2024-41713) English Name&#xff1a;Mitel MiCollab /npm-pwg File Read Vulnerability (CVE-2024-41713) CVSS core: 6.8 漏洞描述&#xff1a; Mitel MiCollab 是加拿大 Mitel 公司推出…

现代密码学总结(上篇)

现代密码学总结 &#xff08;v.1.0.0版本&#xff09;之后会更新内容 基本说明&#xff1a; ∙ \bullet ∙如果 A A A是随机算法&#xff0c; y ← A ( x ) y\leftarrow A(x) y←A(x)表示输入为 x x x ,通过均匀选择 的随机带运行 A A A,并且将输出赋给 y y y。 ∙ \bullet …

VMware:CentOS 7.* 连不上网络

1、修改网络适配 2、修改网卡配置参数 cd /etc/sysconfig/network-scripts/ vi ifcfg-e33# 修改 ONBOOTyes 3、重启网卡 service network restart 直接虚拟机中【ping 宿主机】&#xff0c;能PING通说明centOS和宿主机网络通了&#xff0c;只要宿主机有网&#xff0c;则 Ce…

Linux —— vim 编辑器

一、什么是vim vim是一个功能强大、高度可定制的文本编辑器。以下是对vim编辑器的具体介绍&#xff1a; 历史背景&#xff1a;vim最初由Bram Moolenaar在1991年开发&#xff0c;作为vi编辑器的增强版&#xff0c;增加了许多新的特性和改进。它继承了vi的基本编辑功能和键盘快捷…

前端(async 和await)

1 async async 将 function 变为成为 async 函数 ●async 内部可以使用 await&#xff0c;也可以不使用&#xff0c;因此执行这个函数时&#xff0c;可以使用 then 和 catch 方法 ●async 函数的返回值是一个 Promise 对象 ●Promise 对象的结果由 async 函数执行的返回值决…

huggingface NLP -Transformers库

1 特点 1.1 易于使用&#xff1a;下载、加载和使用最先进的NLP模型进行推理只需两行代码即可完成。 1.2 灵活&#xff1a;所有型号的核心都是简单的PyTorch nn.Module 或者 TensorFlow tf.kears.Model&#xff0c;可以像它们各自的机器学习&#xff08;ML&#xff09;框架中的…

解决 MyBatis 中空字符串与数字比较引发的条件判断错误

问题复现 假设你在 MyBatis 的 XML 配置中使用了如下代码&#xff1a; <if test"isCollect ! null"><choose><when test"isCollect 1">AND exists(select 1 from file_table imgfile2 where task.IMAGE_SEQimgfile2.IMAGE_SEQ and im…

项目15:简易扫雷--- 《跟着小王学Python·新手》

项目15&#xff1a;简易扫雷 — 《跟着小王学Python新手》 《跟着小王学Python》 是一套精心设计的Python学习教程&#xff0c;适合各个层次的学习者。本教程从基础语法入手&#xff0c;逐步深入到高级应用&#xff0c;以实例驱动的方式&#xff0c;帮助学习者逐步掌握Python的…

Centos7上Jenkins+Docker+Git+SpringBoot自动化部署

文章目录 1.宿主机安装maven2.安装jenkins3.配置Jenkins4.Jenkins脚本自动安装JDK&#xff08;可选&#xff09; 1.宿主机安装maven wget https://dlcdn.apache.org/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz mv apache-maven-3.9.9-bin.tar.gz /usr/local…

前端-自定义Ant Design 表格(可编辑表格)

选取的的是&#xff1a;表格 Table - Ant Design 其实ant design本身就有增加和删除单列数据的封装好的表格&#xff0c;但是个人觉得那个功能繁多&#xff0c;自己实现封装也便于之后理解和二次使用。 初步效果&#xff08;舍去切换样式的功能&#xff09;&#xff1a; 突破的…

如何打造个人知识体系?

第一&#xff0c;每个人的基本情况不同。比如我有一个类别跟「设计」相关&#xff0c;这是自己的个人爱好&#xff0c;但不一定适合其他人。再比如我还有一个类别跟「广告文案」相关&#xff0c;因为里面很多表达可以借用到演讲或写作中&#xff0c;这也不适合所有人。 第二&am…

Java版-图论-最短路-Floyd算法

实现描述 网络延迟时间示例 根据上面提示&#xff0c;可以计算出&#xff0c;最大有100个点&#xff0c;最大耗时为100*wi,即最大的耗时为10000&#xff0c;任何耗时计算出来超过这个值可以理解为不可达了&#xff1b;从而得出实现代码里面的&#xff1a; int maxTime 10005…

【EthIf-04】 EthIf_CtrlIdx控制器索引

1 EthernetInterface功能spec 上层的模块访问以太网接口模块「EthernetInterface」&#xff0c;以太网接口模块通过以太网驱动程序层与多个以太网控制器交互的。 1.1 以太网控制器资源的索引 通过以太网接口模块中的以太网控制器资源的索引允许用户轻松访问多个以太网控制器…

IDEA报错:无效的源发行版、无效的目标发行版

1. 无效的源发行版 创建项目的时候&#xff0c;会遇见这个报错&#xff0c;原因就是编译的JDK版本与发布版本不一致。 解决方法&#xff1a; 1.1. 找到问题所在地 英文&#xff1a;File -> Project Structure ->Project Settings 中文&#xff1a;文件->项目结构 …

7_Sass Introspection 函数 --[CSS预处理]

Sass 的 Introspection 函数允许开发者检查和操作样式表的内部结构&#xff0c;包括选择器、属性、值等。这些函数提供了对编译过程中 Sass 文件内容的深入访问能力&#xff0c;使得更复杂的逻辑处理成为可能。以下是一些常用的 Sass Introspection 函数及其用法示例&#xff1…

【实现多网卡电脑的网络连接共享】

电脑A配备有两张网卡&#xff0c;分别命名为eth0和eth1&#xff08;对于拥有超过两张网卡的情况&#xff0c;解决方案相似&#xff09;。其中&#xff0c;eth0网卡能够连接到Internet&#xff0c;而eth1网卡则通过网线直接与另一台电脑B相连&#xff08;在实际应用中&#xff0…