C++ 二叉搜索树【面试】

以下是一个简单的二叉搜索树实现,包括插入和查找操作的示例代码:

#include <iostream>// 定义二叉搜索树的节点结构
struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};// 二叉搜索树类
class BinarySearchTree {
public:BinarySearchTree() : root(nullptr) {}// 插入操作void insert(int val) {root = insertRecur(root, val);}// 查找操作bool find(int val) const {return findRecur(root, val) != nullptr;}private:TreeNode *root;// 递归插入操作TreeNode* insertRecur(TreeNode* node, int val) {if (!node) {return new TreeNode(val);}if (val < node->val) {node->left = insertRecur(node->left, val);} else if (val > node->val) {node->right = insertRecur(node->right, val);}// 如果val已经存在,则不插入return node;}// 递归查找操作TreeNode* findRecur(TreeNode* node, int val) const {if (!node || node->val == val) {return node;}if (val < node->val) {return findRecur(node->left, val);} else {return findRecur(node->right, val);}}
};// 面试时,你可以解释这段代码,并讨论二叉搜索树的各种操作。
int main() {BinarySearchTree bst;bst.insert(50);bst.insert(30);bst.insert(20);bst.insert(40);bst.insert(70);bst.insert(60);bst.insert(80);if (bst.find(60)) {std::cout << "Found 60 in the BST." << std::endl;} else {std::cout << "60 is not in the BST." << std::endl;}return 0;
}

二叉搜索树的特点:

  1. 有序性:对于BST中的任意节点,其左子树上所有节点的值均小于该节点的值,右子树上所有节点的值均大于该节点的值。

  2. 二叉树结构:每个节点最多有两个子节点,通常左子节点称为左子树,右子节点称为右子树。

  3. 动态数据结构:二叉搜索树可以在运行时动态地添加和删除节点。

  4. 时间复杂度:在平衡的情况下,BST的查找、插入和删除操作的时间复杂度为O(log n)。但在最坏的情况下(例如,树退化为链表),时间复杂度为O(n)。

  5. 遍历方式:BST可以通过中序遍历(In-Order Traversal)来实现有序遍历。

二叉搜索树的实现要点:

  1. 节点定义:通常使用一个结构体或类来定义树的节点,包含数据域和指向左右子节点的指针。

  2. 插入操作:根据BST的特性,递归地将新节点插入到正确的位置。

  3. 查找操作:从根节点开始,根据目标值与当前节点值的比较结果,决定是向左子树还是向右子树搜索。

  4. 删除操作:删除节点稍微复杂,需要考虑三种情况:无子节点、有一个子节点、有两个子节点。

  5. 平衡问题:为了保持BST的高效性,需要考虑平衡问题,可以使用AVL树或红黑树等自平衡二叉搜索树。

面试回答示例:

"二叉搜索树是一种非常有效的数据结构,用于快速查找、插入和删除操作。它的核心特点是每个节点的值都大于其左子树上所有节点的值,小于其右子树上所有节点的值。这保证了二叉搜索树可以进行中序遍历,从而获得有序的数据序列。

在实现BST时,我们需要定义一个节点结构,包含数据域和指向左右子节点的指针。插入操作是通过递归地比较节点值来完成的。查找操作则是从根节点开始,根据目标值与当前节点值的比较结果,决定搜索的方向。

然而,如果不考虑平衡,二叉搜索树在最坏的情况下可能会退化成链表,导致操作的时间复杂度退化为O(n)。为了解决这个问题,我们可以使用平衡二叉搜索树,如AVL树或红黑树,它们通过旋转操作来保持树的平衡,确保所有操作的时间复杂度接近O(log n

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot定时任务编程指南:如何创建和配置周期性任务

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN签约讲师&#xff0c;CSDN博客专家&#xff0c;华为云云享专家&#xff0c;阿里云专家博主 &#x1f4cc; 擅长领域&#xff1a;全栈工程师、爬虫、ACM算法 &#x1f525; 微信&#xff1a;zsqtcyw 联系我领取学习资料 …

基于Langchain构建本地大型语言模型(LLM)问答系统的经验分享

基于Langchain构建本地大型语言模型&#xff08;LLM&#xff09;问答系统的经验分享 https://download.csdn.net/download/xziyuan/89334371?spm1001.2101.3001.9500 最近&#xff0c;我一直在探索如何利用Langchain来构建一个本地的大型语言模型问答系统。在这个过程中&…

消息中间件比较:Redis,Kafka和RabbitMQ

对微服务使用异步通信时&#xff0c;通常使用消息代理。代理确保不同微服务之间的通信可靠且稳定&#xff0c;消息在系统内得到管理和监控&#xff0c;并且消息不会丢失。您可以从几个消息代理中进行选择&#xff0c;它们的规模和数据功能各不相同。这篇博文将比较三种最受欢迎…

不知道密码,一样能卸载瑞星esm防病毒终端安全防护系统

离开单位后试图卸载瑞星的时候却发现还需要密码&#xff0c;真是烦死了。研究了几分钟后找到了完美卸载方法。 首先&#xff0c;让我们请出老流氓360安全卫士&#xff0c;下载好它&#xff0c;让右键菜单出现使用 360强力删除这一选项。 之后&#xff0c;进入安全模式&#x…

中医药人工智能大模型正式启动

6月15日&#xff0c;在横琴粤澳深度合作区举行的中医药广东省实验室&#xff08;以下简称横琴实验室&#xff09;第一届学术委员会第一次会议暨首届横琴中医药科技创新大会上&#xff0c;中医药横琴大模型、中药新药智能自动化融合创新平台同时启动。这也是该实验室揭牌半年来取…

迷你手持小风扇十大名牌排名有哪些?公认迷你小风扇排行榜揭开!

随着夏季高温的来临&#xff0c;迷你小风扇成为了大家追求清凉和舒适的必备工具。其小巧便携的设计、强劲的风力和长续航时间&#xff0c;使得迷你小风扇迅速在市场上走红。然而&#xff0c;面对琳琅满目的品牌和各种型号&#xff0c;如何选择一款既高效又耐用的迷你小风扇成为…

UE5 C++ 跑酷游戏练习 Part1

一.修改第三人称模板的 Charactor 1.随鼠标将四处看的功能的输入注释掉。 void ARunGANCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) {// Set up action bindingsif (UEnhancedInputComponent* EnhancedInputComponent CastChecked&…

python+unity手势控制地球大小

效果图如下 具体操作如下 1 在unity窗口添加一个球体 2 给球体添加材质,材质图片使用地球图片 地球图片如下 unity材质设置截图如下 3 编写地球控制脚本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class test : MonoBehavio…

RK3588/算能/Nvidia智能盒子:加速山西铝业智能化转型,保障矿业皮带传输安全稳定运行

近年来&#xff0c;各类矿山事故频发&#xff0c;暴露出传统矿业各环节的诸多问题。随着全国重点产煤省份相继出台相关政策文件&#xff0c;矿业智能化建设进程加快。皮带传输系统升级是矿业智能化的一个重要环节&#xff0c;同时也是降本增效的一个重点方向。 △各省份智能矿山…

《UNIX环境高级编程》第三版(电子工业出版社出品)——两年磨一剑的匠心译作

历时两年&#xff0c;《UNIX环境高级编程》的翻译工作终于落下帷幕。这一路走来&#xff0c;真可谓是如鱼饮水&#xff0c;冷暖自知。还记得最初看到招募译者消息的那一刻&#xff0c;内心的激动难以言表。我毫不犹豫地报名&#xff0c;而后经历了试译、海选等激烈的角逐&#…

【CMake】Linux 下权限丢失与软链接失效问题

【CMake】Linux 下权限丢失与软链接失效问题 文章目录 【CMake】Linux 下权限丢失与软链接失效问题问题概述解决方法1 - 安装目录2 - 安装文件3 - 手动指定 使用 Linux 下原生命令行注意事项参考链接 问题概述 一般使用 CMake 安装&#xff0c;在 Windows 平台不会出问题&…

基于块生成最大剩余空间的三维装箱算法

问题简介 三维装箱问题&#xff08;3D Bin Packing Problem&#xff0c;3D BPP&#xff09;是一类组合优化问题。它涉及到将一定数量的三维物品放入一个或多个三维容器&#xff08;称为“箱子”&#xff09;中&#xff0c;同时遵循一定的约束&#xff0c;通常目标是最大化空间…

后端开发中缓存的作用以及基于Spring框架演示实现缓存

缓存的作用及演示 现在我们使用的程序都是通过去数据库里拿数据然后展示的 长期对数据库进行数据访问 这样数据库的压力会越来越大 数据库扛不住了 创建了一个新的区域 程序访问去缓存 缓存区数据库 缓存里放数据 有效降低数据访问的压力 我们首先进行一个演示 为了演示…

力扣207题“课程表”

在本篇文章中&#xff0c;我们将详细解读力扣第207题“课程表”。通过学习本篇文章&#xff0c;读者将掌握如何使用拓扑排序和深度优先搜索&#xff08;DFS&#xff09;来解决这一问题&#xff0c;并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释&#xff0…

滚球游戏笔记

1、准备工作 (1) 创建地面&#xff1a;3D Object-Plane&#xff0c;命名为Ground (2) 创建小球&#xff1a;3D Object-sphere&#xff0c;命名为Player&#xff0c;PositionY 0.5。添加Rigidbody组件 (3) 创建文件夹&#xff1a;Create-Foder&#xff0c;分别命名为Material…

css3多列布局

css3多列布局 colmns属性 columns属性是一个简写属性 column-count属性&#xff1a;定义列的数量或者允许的最大列数 auto 为默认值&#xff0c;用于表示列的数量由其他css属性决定number 必须是正整数&#xff0c;用于定义列数量 column-width属性&#xff1a;定义列的宽度 …

Java入门第01篇

文章目录 前言 一、Java是什么&#xff1f; 二、Java开发工具 1.Java 2.开发工具 3.构建工具 三、Java开发过程 1.IDEA操作 2.Maven操作 2.1本地jar包的情况 3.docker操作 总结 前言 机缘巧合&#xff0c;接触到了Java开发&#xff0c;那就把了解学习到的一些东西…

【Arc gis】使用DEM提取流域范围

地址&#xff1a;arcgis DEM 提取流域范围&#xff08;详细教程&#xff09;(空间分析--Hydrology)_gis的gridcode是什么意思-CSDN博客

AUTOSAR学习

文章目录 前言1. 什么是autosar&#xff1f;1.1 AP&#xff08;自适应平台autosar&#xff09;1.2 CP&#xff08;经典平台autosar)1.3 我的疑问 2. 为什么会有autosar3.autosar的架构3.1 CP的架构3.1.1 应用软件层3.1.2 运行时环境3.1.3 基础软件层 3.2 AP的架构 4. 参考资料 …

shell脚本中的变量

关于Linux操作系统中当前shell进程与子shell进程的详细解释 如上图所示&#xff0c;使用ps -f可以当前查看Linux操作系统中当前正在运行的进程。 然后敲bash后&#xff0c;相当于在当前的bash shell环境下又创建了一个子bash shell的进程&#xff0c; 如上图所示&#xff0c;…