剑指offer之二叉搜索树的第K个节点

1 问题

给定一颗二叉搜索树,请找出其中的第k小的结点。例如, 5  3  7  2  4  6  8 中,按结点数值大小顺序第三个结点的值为4。

 

 

 

2 分析

二叉树定义:二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。

具体分析:按照定义,我们不难知道二叉查找树如果按照数的中序遍历,我们可以得到单调递增的排列数,我们需要找到第K个节点,也就是中序遍历树的第K个节点。

我们可以通过递归中序遍历求解答,也可以通过通过栈来实现树的中序遍历

 

 

3 代码实现

#include <iostream>
#include <stdlib.h>
#include <stack>using namespace std;typedef struct Tree
{int value;struct Tree* left;struct Tree* right;
} Tree;Tree* getNode(Tree* node, int k)
{if (k <= 0){std::cout << "输入的k值不合法" << std::endl;return NULL;}int count;if (node == NULL)return NULL;getNode(node->left, k);//std::cout << "value is " << node->value <<std::endl;count++;if (count == k){return node;}getNode(node->right, k);return node;
}Tree* getNode1(Tree* node, int k)
{if (k <= 0){std::cout << "输入的k值不合法" << std::endl;return NULL;}if (node == NULL)return NULL;std::stack<Tree *> stack;Tree *p = node;int count = 0;while (p != NULL || !stack.empty()){if (p != NULL){stack.push(p);p = p->left;}else{Tree *value = stack.top();//std::cout << "value is " << value->value << std::endl;count++;//这里需要pop函数弹出来,不然永远都是二叉树的最左下角的值stack.pop();if (k == count){return value;}p = value->right;}}return NULL;
}int main() {/***    42         61     3   5     7     **/Tree *node1 , *node2 , *node3, *node4, *node5, *node6, *node7;node1 = (Tree *)malloc(sizeof(Tree));node2 = (Tree *)malloc(sizeof(Tree));node3 = (Tree *)malloc(sizeof(Tree));node4 = (Tree *)malloc(sizeof(Tree));node5 = (Tree *)malloc(sizeof(Tree));node6 = (Tree *)malloc(sizeof(Tree));node7 = (Tree *)malloc(sizeof(Tree)); node1->value = 4;node2->value = 2;node3->value = 6;node4->value = 1;node5->value = 3;node6->value = 5;node7->value = 7;node1->left = node2;node1->right = node3;node2->left = node4;node2->right = node5;node3->left = node6;node3->right = node7;node4->left = NULL;node4->right = NULL;node5->left = NULL;node5->right = NULL;node6->left = NULL;node6->right = NULL;node7->left = NULL;node7->right = NULL;Tree *result = getNode(node1, 4);if (result != NULL){std::cout << "result is " << result->value << std::endl;}Tree *result1 = getNode1(node1, 4);if (result1 != NULL){std::cout << "result1 is " << result1->value << std::endl;}return 0;
}

 

 

 

 

 

4 运行结果

result is 4
result1 is 4

 

 

 

 

5 总结

我们用栈(stack)进行中序遍历的时候,我们不应该一开始就把树的顶部节点压入栈,这个时候基本上后面再在while循环里面做top操作基本上无解,然后我们既然是要执行左 中 右效果,我们需要单独定义一个遍历保存第一个节点,然后依次压入左孩子节点,然后如果是空就不压进去,而要执行获取顶部元素,这个就是我们需要的值,然后还有把这个元素进行弹出来(pop)操作,然后把这个值的右孩子节点压入栈,这样就可以保证是左 中 右打印值的效果。

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

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

相关文章

Python turtle库实现基本剖析

有关turtle的相关使用请参考《python图形绘制库turtle中文开发文档及示例大全》 本篇文为turtle库的实现剖析&#xff0c;但不涉及 python 的 TK库。 开始 入口探寻 在turtle中&#xff0c;直走是使用 forward 或者 fd 函数&#xff1b;在本机安装好了 turtle 库后&#xf…

git菜单形式的_Idea:Git的常用菜单操作和常用命令

工作中多人使用版本控制软件协作开发&#xff0c;常见的应用场景归纳如下&#xff1a;假设小组中有两个人&#xff0c;组长小张&#xff0c;组员小袁场景一&#xff1a;小张创建项目并提交到远程Git仓库场景二&#xff1a;小袁从远程Git仓库上获取项目源码场景三&#xff1a;小…

分享我做Dotnet9博客网站时积累的一些资料

从2019年使用WordPress搭建Dotnet9网站&#xff0c;到现在手撸代码开发&#xff0c;介绍中间使用的一些资源&#xff0c;绝无保留&#xff0c;希望对大家有用。1. 申请域名、搭建WordPress网站时间点&#xff1a;2019年11月申请Dotnet9域名&#xff0c;讲个实话&#xff0c;站长…

css媒体查询改变上边距,CSS媒体查询宽度或高度

我在一个全屏页面的中心放置了一个徽标。img.logo {width: 920px;height: 552px;position: absolute;top: 50%;left: 50%;margin-left: -460px;margin-top: -276px;}这很好用。现在我想在不同的设备高度和宽度上使用不同的尺寸&#xff0c;所以我尝试使用媒体查询。media (max-…

基于Azure Blob冷存储的数据压缩备份总结

基于上一篇的压缩算法对比分析报告&#xff0c;选择了LZ4算法的普通模式&#xff0c;其测试压缩率为28%&#xff0c;20G压缩时间为256s&#xff0c;估计1T的冷备时间为3.5h。 接下来&#xff0c;将23T的HBase历史数据进行了压缩冷备&#xff0c;压缩后大小为3.5T&#xff0c;冷…

Ubuntu使用VNC运行基于Docker的桌面系统

2019独角兽企业重金招聘Python工程师标准>>> docker-ubuntu-vnc-desktop From Docker Index docker pull dorowu/ubuntu-desktop-lxde-vnc Build yourself git clone https://github.com/fcwu/docker-ubuntu-vnc-desktop.git docker build --rm -t dorowu/ubuntu-de…

【ArcGIS风暴】ArcGIS个人数据库(.mdb)中矢量字段(如Shape_Length、Shape_Area)无法删除的解决办法

ArcGIS中,某些操作,比如空间连接(Spatial Join)结果属性表中会自动产生Shape_Length和Shape_Area字段,这些字段无法删除,如下: 即使在工具箱中的【删除字段】工具,也找不到这些字段,如图所示,给我们的数据入库工作带来了一定的困扰。 解决思路: mdb是个人数据库,基…

excel导入 HSSFWorkbook和XSSFWorkbook

excel导入 excel版本有03版本和07版本的区别&#xff0c;文件后缀名分别为.xls和.xlsx。它们对应的POI中的Workbook也是不同的&#xff0c;分别是HSSFWorkbook和XSSFWorkbook&#xff1b; 对于不同版本的EXCEL文档要使用不同的工具类&#xff0c;如果使用错了&#xff0c;会提示…

python thinker canvas create_arc 使用详解

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/A757291228/article/details/106739556 ———————————————— 版权声明&#xff1a;本文…

剑指offer之二叉搜索树和双向链表

1 问题 比如我们搜索二叉树如下&#xff0c;我们需要变成双向链表 2 分析 我们知道这个变成双向链接的时候是按照树的中序遍历打印的&#xff0c;我们只需要在中序遍历打印的时候操作该节点&#xff0c;我们可以用临时变量保存这个节点&#xff0c;同时我们也需要单独增加一…

text 热敏打印机_只要有想象力,打印机都能做游戏

不知道为什么&#xff0c;文本冒险游戏最近频频被人提及。这不&#xff0c;现在又出来一个基于实时打印的文本冒险游戏 —— Quest Smith。这位脑洞较大的创客名叫 Bekir Dağ &#xff0c;他用微型打印机和树莓派做出了这个手持游戏设备。关于文本冒险游戏的背景知识&#xff…

C#内建接口:IConvertible

这节来讲一个比较有意思的接口&#xff1a;IConvertible。IConvertible接口处于System.Runtime命名空间下&#xff0c;这个接口规定了一批ToXxx()方法&#xff0c;凡是实现了这个接口的方法&#xff0c;我们都可以尝试将其转换为自己想要的类型。IConvertible中有什么&#xff…

ArcGIS升级地理数据库

本博文教大家如何快速地将低版本地理数据库升级为高版本地理数据库。 方法一&#xff1a;使用“升级地理数据库”工具箱二、使用ArcCatalog地理数据库→右键→属性。三、创建不同版本的地理数据库

Android官方命令深入分析之Hierarchy Viewer

Hierarchy Viewer允许你调试和优化用户界面。它提供了一个层可视的方式来显示。 启动Hierarchy Viewer&#xff0c;如下&#xff1a; 在Android Studio中&#xff0c;选择Tools > Android Device Monitor。进入SDK tools文件夹&#xff0c;在命令行输入monitor转载于:https:…

汉高软件服务器安装系统,如何安装了如指掌眼镜管理系统的服务器和客户端,还需要安装什么软件的?...

满意答案ven85202014.05.09采纳率&#xff1a;53% 等级&#xff1a;7已帮助&#xff1a;356人易软眼镜店管理系统它整合了整个眼镜店的收费、客户登记、验光单管理、配镜管理、财务管理和查旬报表以及库存管理一体化的管理系统。随时可以查看客户的验光单、对比&#xff0c;…

Python3 实现单例设计模式

单例模式的一般实现 饿汉式 懒汉式就是通过一个方法才能实现单例&#xff0c;我不是很常用&#xff0c;所以在此就写个饿汉式。以后再补懒汉式。 单例模式的核心作用是保证一个类只有一个该类型的对象。在一个对象被过多调用时避免过多的消耗内存&#xff0c;即可使用单例模式…

js最全的十种跨域解决方案

在客户端编程语言中&#xff0c;如javascript和ActionScript&#xff0c;同源策略是一个很重要的安全理念&#xff0c;它在保证数据的安全性方面有着重要的意义。同 源策略规定跨域之间的脚本是隔离的&#xff0c;一个域的脚本不能访问和操作另外一个域的绝大部分属性和方法。那…

剑指offer之二叉树的下一个结点

1 问题 给定一个二叉树和其中的一个结点&#xff0c;请找出中序遍历顺序的下一个结点并且返回。注意&#xff0c;树中的结点不仅包含左右子结点&#xff0c;同时包含指向父结点的指针 2 分析 比如我现在的二叉树如下 42 61 3 5 7 这里分3种情况 1) 如果…

查看和修改系统时间

Echo -n 不换行显示 echo -e不转义Date ‘%Y-%m-%d 查看当前时间 date-s ‘2017/09/04’表示修改时间 %w表示周 %H:%M:%S时分秒 %F%Y-%m-%d %T%H:%M:%S$()反引号 hwclock将修改后的系统时间写到bios里Date %F -d ‘-3 day’三天前 -一定要Date %F -d ‘3 day’三天以后 …

fanuc机器人码垛编程实例_FANUC 机器人码垛编程详细讲解 记得收藏!

原标题&#xff1a;FANUC 机器人码垛编程详细讲解 记得收藏&#xff01;1. 码垛功能的定义对几个具有代表性的点进行示教&#xff0c;即可以从下层到上层按照顺序堆叠工件。2. 码垛的种类码垛 B:包括码垛B(单路径模式)和码垛BX(多路径模式) 适用于工件姿势恒定&#xff0c;堆叠…