新闻详情

新闻详情

首页 / 资讯中心 / 详情

44 二叉搜索树中第K小的元素

发布时间:2026/9/29 15:08:42来源:尧图网络
44 二叉搜索树中第K小的元素
给定一个二叉搜索树的根节点root和一个整数k请你设计一个算法查找其中第k小的元素k从 1 开始计数。示例 1输入root [3,1,4,null,2], k 1输出1示例 2输入root [5,3,6,2,4,null,null,1], k 3输出3提示树中的节点数为n。1 k n 1040 Node.val 104思路二叉搜索树有一个特点就是中序遍历的结果是有序的。可以使用中序遍历的方法遍历二叉搜索树然后返回第k小的元素。中序非递归遍历需要用栈来遍历1、将根节点和左子树的节点入栈stack.push(root);2、一直走向他的左子树循环入栈直到节点为空while(root){ rootroot-left; stack.push(root); }3、栈顶出栈走向右子树节点出栈第k次即为第k小的元素直接返回rootstack.top(); rootroot-right;4、第二次循环继续持续走root节点的左子树让左子树入栈while(root){ rootroot-left; stack.push(root); }5、栈为空和root为空时退出循环。由于题目的限制不需要考虑k不满足条件的情况。int kthSmallest(TreeNode* root, int k) { if(!root) return -3; stackTreeNode* stack; while(root||!stack.empty()){ //一直往左走 while(root){ stack.push(root); rootroot-left; } //root为空时出栈 if(!stack.empty()){ rootstack.top(); stack.pop(); k--; if(0k) return root-val; } rootroot-right; } return 0; }如果你需要频繁地查找第k小的值你将如何优化算法可以记录下以每个结点为根结点的子树的结点数并在查找第 k 小的值时使用如下方法搜索令 node 等于根结点开始搜索。对当前结点 node 进行如下操作【1】如果 node 的左子树的结点数 left 小于 k−1则第 k 小的元素一定在 node 的右子树中令 node 等于其的右子结点k 等于 k−left−1并继续搜索。【2】如果 node 的左子树的结点数 left 等于 k−1则第 k 小的元素即为 node 结束搜索并返回 node 即可。【3】如果 node 的左子树的结点数 left 大于 k−1则第 k 小的元素一定在 node 的左子树中令 node 等于其左子结点并继续搜索。class MyBst { public: MyBst(TreeNode *root) { this-root root; countNodeNum(root); } ​ // 返回二叉搜索树中第k小的元素 int kthSmallest(int k) { TreeNode *node root; while (node ! nullptr) { int left getNodeNum(node-left); if (left k - 1) { node node-right; k - left 1; } else if (left k - 1) { break; } else { node node-left; } } return node-val; } ​ private: TreeNode *root; unordered_mapTreeNode *, int nodeNum; ​ // 统计以node为根结点的子树的结点数 int countNodeNum(TreeNode * node) { if (node nullptr) { return 0; } nodeNum[node] 1 countNodeNum(node-left) countNodeNum(node-right); return nodeNum[node]; } ​ // 获取以node为根结点的子树的结点数 int getNodeNum(TreeNode * node) { if (node ! nullptr nodeNum.count(node)) { return nodeNum[node]; }else{ return 0; } } }; ​ class Solution { public: int kthSmallest(TreeNode* root, int k) { MyBst bst(root); return bst.kthSmallest(k); } };推荐一个零声教育学习教程个人觉得老师讲得不错分享给大家[LinuxNginx ZeroMQMySQLRedisfastdfsMongoDBZK流媒体CDNP2PK8SDockerTCP/IP协程DPDK等技术内容点击立即学习:链接
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

阿里云产品手册2025.pdf深度解读:从选型地图到成本看板的四步落地法 2026/9/29 16:13:37

阿里云产品手册2025.pdf深度解读:从选型地图到成本看板的四步落地法

简介:阿里云产品手册2025.pdf面向云计算从业者、企业架构师、开发者及技术选型人员,系统梳理阿里云全栈产品体系,帮助读者快速建立对云平台能力版图的整体认知,解决产品繁多、分类不清、选型困难等问题。资源为单个PDF文件&#x…

阅读更多 →
ARM汇编中BIC与CMP指令的硬件原理与实时优化 2026/9/29 16:13:37

ARM汇编中BIC与CMP指令的硬件原理与实时优化

1. 为什么BIC和CMP是ARM汇编里最常被低估的“组合拳” 在嵌入式开发、Linux内核裁剪、RTOS底层驱动优化,甚至Android HAL层性能调优的实际项目中,我见过太多人一上来就猛啃LDR/STR、跳转指令,却把BIC和CMP当成教科书里的“基础语法”草草略过…

阅读更多 →
高压DC-DC升压模块选型实战指南:从90V到900V的工程决策链 2026/9/29 16:13:37

高压DC-DC升压模块选型实战指南:从90V到900V的工程决策链

1. 为什么“升压模块选型”不是查参数表就能搞定的事?你手头有个传感器需要90V偏置电压,或者工业PLC的继电器驱动要200V直流,又或者某款新型光电编码器明确要求450V供电——这时候打开电商页面搜“DC-DC升压模块”,弹出上千个结果…

阅读更多 →
ARM汇编中BIC与CMP的协同原理与实战优化 2026/9/29 16:13:37

ARM汇编中BIC与CMP的协同原理与实战优化

1. 为什么BIC和CMP是ARM汇编里最常被低估的“组合拳” 在嵌入式开发、Linux内核驱动调试、RTOS底层优化这些真实场景里,我见过太多人把BIC和CMP当成教科书里的“基础指令”匆匆略过——直到某天在性能瓶颈分析中卡死三天,才发现问题出在一条没被重视的BI…

阅读更多 →
栈的三大经典应用:括号匹配、相邻消除与逆波兰表达式求值 2026/9/29 16:13:31

栈的三大经典应用:括号匹配、相邻消除与逆波兰表达式求值

刷算法题刷到代码随想录day11的栈与队列part2,也就是20.有效的括号、1047.删除字符串中的所有相邻重复项、150.逆波兰表达式求值这三道经典题时,我最大的感受是:栈终于开始干正事了。前面part1用栈实现队列、用队列实现栈,更多是结…

阅读更多 →
Linux服务器MySQL自动备份:crontab+mysqldump实战方案 2026/9/29 16:13:30

Linux服务器MySQL自动备份:crontab+mysqldump实战方案

很多人觉得备份是“有空再说”的事,直到某天误删了一张业务表、服务器磁盘突然报废,或者被同事一条 DROP DATABASE 直接清库,才追悔莫及。尤其是Linux服务器上的MySQL,很多人平时连ssh都懒得登,更别说天天盯着数据了…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉