news 2026/3/22 23:44:12

树论_二叉查找树

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
树论_二叉查找树

二叉查找树适合动态查找,即随时可能有插入和删除操作

Binary Search Tree的定义

  • 对于一颗非空BST,其左子树上的所有节点的data小于其根节点的data,其右子树上的所有节点的data大于其根节点的data
  • BST的非空左子树和非空右子树也是BST

利用BST左小于右的特性,可以用来找到BST中两个节点的最近的共同的祖先节点(这里可以把节点自己也算作祖先)
从根节点开始,若两个节点的key都小于当前节点的key,说明公共祖先在左子树上,递归左子树
若两个节点的key都大于当前节点的key,说明公共祖先在右子树上,递归右子树
否则说明公共祖先就是这个节点

BST查找特定key

递归实现

假设在函数外有一个指针接收找到的节点的地址,没找到返回空

对于当前访问的节点,若不为空,有三种:

  1. 要查找的key小于当前节点,则递归查找左子树
  2. 要查找的key大于当前节点,则递归查找右子树
  3. 要查找的key等于当前节点,则返回当前节点的指针
TreeNode* BSTfind(TreeNode* t,DataType key){ if(!root)return nullptr; if(key<t->data)return BSTfind(t->left,key); //1. else if(key>t->data)return BSTfind(t->right,key); //2. else return t; //3. }

注意到这是尾递归,所以可以写成迭代函数

迭代实现

TreeNode* BSTfind(TreeNode* t,DataType key){ TreeNode* p=t; //用p指针来访问节点 while(p){ if(key<p->data)p=p->left; //1. else if(key>p->data)p=p->right; //2. else break; //3. } return p; }

BST查找最小值和最大值

根据BST的特性,一颗BST的最小值在最左端的节点上,最大值在最右端的节点上
也是尾递归

递归实现

TreeNode* findMin(TreeNode* t){ //找最小值 if(!t)return nullptr; //空树的情况 if(t->left)return findMin(t->left); //没到最左端 else return t; //到了最左端 } TreeNode* findMax(TreeNode* t){ if(!t)return nullptr; if(t->right)return findMax(t->right); else return t; }

迭代实现

TreeNode* findMin(TreeNode* t){ if(!t)return nullptr; while(t->left){ t=t->left; } return t; } TreeNode* findMax(TreeNode* t){ if(!t)return nullptr; while(t->right){ t=t->right; } return t; }

BST的插入

与查找类似,若走到空节点,说明需要在这里插入,若走到与key相等的节点,则根据实际需要处理(插入失败或插在子树的根节点上)

返回已经插入了的根节点

bool isInsert=true; //判断是否插入成功 TreeNode* BSTinsert(TreeNode* t,DataType key){ if(!t){ //空节点 t=new TreeNode; t->data=key; t->left=t->right=nullptr; return t; } if(key<t->data)t->left=BSTinsert(t->left); //1. else if(key>t->data)t->right=BSTinsert(t->right); //2. else isInsert=false; //3. return t;

也可以看作是尾递归

BST的删除

与查找类似,若走到与key相等的节点,说明需要在这里删除,若走到空节点,则说明BST中找不到需要删除的节点

返回已经删除了的根节点

若找到了需要删除的节点

  1. 若该节点左子树和右子树都为空,则返回空(其实就是返回空左子树和空右子树其中之一,可合并为下面两种情况)
  2. 若该节点存在左子树,右子树为空,则返回左子树,回收该节点
  3. 若该节点存在右子树,左子树为空,则返回右子树,回收该节点
  4. 若左右子树都不空,有两种方案
    • 找到左子树上的最大值节点leftMax,与该节点交换data,然后递归删除leftMax
    • 找到右子树上的最小值节点rightMin,与该节点交换data,然后递归删除rightMin
      leftMax和rightMin都是存在空子树的情况,删除比较简单
bool isDelete=true; TreeNode* BSTdelete(TreeNode* t,key){ if(!t){ //找不到要删除的节点 isDelete=false; return t; //不做处理,直接返回 } if(key<t->data)t->left=BSTdelete(t->left,key); else if(key>t->data)t->right=BSTdelete(t->right,key); else { if(t->left&&t->right){ //左右子树都不空 TreeNode* leftMin; leftMax=findMin(t->left); t->data=leftMin->data; //和t交换 t->left=BSTdelete(t->left,leftMin->data); //删除leftMax } else if(t->left){ //左子树不空 TreeNode* tmp=t; t=t->left; delete tmp; //回收 } else { TreeNode* tmp=t; t=t->right; delete tmp; } } return t; //返回已经删除了的根节点 }

BST的缺点

随着插入和删除操作增多,可能出现斜二叉树这种极端情况,因为BST的查找和删除操作的最坏时间复杂度都是树的高度,所以树的高度越小越好

优化:平衡二叉树

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/18 6:09:54

Windows右键菜单终极优化指南:ContextMenuManager完全掌握手册

还在为杂乱的右键菜单烦恼吗&#xff1f;每次点击右键都要在几十个选项中寻找需要的功能&#xff1f;今天我要向你推荐一款Windows右键菜单优化神器——ContextMenuManager&#xff0c;帮你彻底告别菜单混乱&#xff0c;打造专属高效操作体验&#xff01;&#x1f680; 【免费下…

作者头像 李华
网站建设 2026/3/12 23:57:03

青龙自动化脚本完整指南:5分钟快速部署与实战应用

青龙自动化脚本完整指南&#xff1a;5分钟快速部署与实战应用 【免费下载链接】huajiScript 滑稽の青龙脚本库 项目地址: https://gitcode.com/gh_mirrors/hu/huajiScript 想要轻松管理各类自动化任务却不知从何入手&#xff1f;滑稽青龙脚本库为您提供了完整的解决方案…

作者头像 李华
网站建设 2026/3/17 8:23:03

Cesium快速入门15:图元Primitive创建图像物体

前面我们一直用 Entity——也就是“实体”——画矩形、椭球、走廊、圆柱、多边形、球体等等。Entity 把底层细节包得严严实实&#xff0c;一两行代码就能出效果。 可如果想再“底层”一点&#xff0c;自己捏顶点、配材质、写外观&#xff0c;那就得请出今天的主角&#xff1a;P…

作者头像 李华
网站建设 2026/3/20 12:04:53

Java毕设选题推荐:基于SpringBoot大学生心理健康咨询管理系统的分析与设计基于springboot高校大学生心理咨询管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/3/22 11:10:42

百度网盘秒传终极指南:三步实现免下载极速传输

百度网盘秒传终极指南&#xff1a;三步实现免下载极速传输 【免费下载链接】baidupan-rapidupload 百度网盘秒传链接转存/生成/转换 网页工具 (全平台可用) 项目地址: https://gitcode.com/gh_mirrors/bai/baidupan-rapidupload 还在为百度网盘下载速度慢而烦恼&#xf…

作者头像 李华
网站建设 2026/3/21 9:46:34

如何一键搞定B站视频下载?这款神器让你离线追剧无忧

还在为B站视频无法下载而烦恼吗&#xff1f;BiliDownload作为一款专业的B站视频下载工具&#xff0c;让你轻松将喜欢的UP主作品、热门剧集保存到本地&#xff0c;随时随地离线观看。无论是网络不稳定时的追剧需求&#xff0c;还是收藏珍贵视频资源&#xff0c;这款工具都能完美…

作者头像 李华