二叉搜索树中第k大元素_二叉搜索树中第K个最小元素

二叉搜索树中第k大元素

Problem statement:

问题陈述:

Find the k-th smallest element in a given binary search tree (BST).

在给定的二进制搜索树(BST)中找到第k个最小的元素。

Example:

例:

K-th smallest element in a Binary Search Tree
    K=4
Kth smallest element in the above binary tree is: 6
K=5
Kth smallest element in the above binary tree is: 7

Solution:

解:

One possible solution is to store the in-order traversal of the BST and printing the Kth element from the list. This can be done because in-order traversal of the BST produces a sorted list. But this solution leads to the overhead of additional storage which may not be entertained.

一种可能的解决方案是存储BST的有序遍历并从列表中打印第K个元素。 之所以可以这样做是因为BST的有序遍历会生成一个排序列表。 但是该解决方案导致可能无法解决的额外存储的开销。

So, we go for a much better solution where we don’t need any additional space.

因此,我们寻求了一个更好的解决方案,不需要任何额外的空间。

Algorithm:

算法:

//k, count both parameter are passed by reference
FUNCTION kthSmallest (root, int & k, int &count) 
1.  Base case
IF (root is NULL)
Return 0;
2. Carry out in-order traversal and keep checking for kth smallest element.
left=kthSmallest (root->left, k, count) //for left subtree
IF (left)
return left;
Increment count
IF (count==k)
return root->data; //kth smallest element
kthSmallest(root->right,k,count); //for right subtree
In the main function we call kthSmallest (root, k, 0) //count 0 initially

Example with explanation:

带有说明的示例:

Example | K-th smallest element in a Binary Search Tree
    In the main function we make call to kthSmallest(root, 4, 0)
-------------------------------------------------------------
KthSmallest (8, 4, 0)
8 not NULL
Left= KthSmallest(8->left , 4, 0);
Call to KthSmallest(3 , 4, 0): //8->left=3
-------------------------------------------------------------
KthSmallest (3, 4, 0)
3 not NULL
Left=KthSmallest(3->left , 4, 0);
Call to KthSmallest(1 , 4, 0): //3->left=1
-------------------------------------------------------------
KthSmallest (1, 4, 0)
1 not NULL
Left= KthSmallest(1->left , 4, 0);
Call to KthSmallest(NULL , 4, 0): //1->left=NULL
-------------------------------------------------------------
KthSmallest (NULL, 4, 0)
node is NULL
return 0;
-------------------------------------------------------------
Control back to KthSmallest (1, 4, 0):
Left=0
Increment count
Count=1;
K!=count
Call to kthSmallest(1->right, 4, 1) 
-------------------------------------------------------------
This is again NULL and control backs to KthSmallest (1, 4, 0)
Since end of function reached control backs to KthSmallest (3, 4, 0)
KthSmallest (3, 4, 0):
Increment count
Count=2 //it’s not 1 because count is passed by reference
K!=count
Call to KthSmallest(3->right, 4, 2)

So if you carry out similar way you will be able to find the k-th smallest one once k==count

因此,如果执行类似的方法,则一次k == count就能找到第k个最小的 整数

C++ implementation:

C ++实现:

#include <bits/stdc++.h>
using namespace std;
// tree node is defined
class Node{
public:
int data;
Node *left;
Node *right;
};
// creating new node
Node* newnode(int data)  
{ 
Node* node = (Node*)malloc(sizeof(Node)); 
node->data = data; 
node->left = NULL; 
node->right = NULL; 
return(node); 
} 
//finding kth smallest element
int kthSmallest(Node *root, int& k,int &count){ 
if(!root)
return 0;
int left=kthSmallest(root->left,k,count);	
if(left)
return left;
count=count+1;
if(count==k)
return root->data;
kthSmallest(root->right,k,count);
}
int main()
{
//building the bst
int count=0,k;
Node *root=newnode(8); 
root->left= newnode(3); 
root->right= newnode(10); 
root->right->right=newnode(14);
root->right->right->left=newnode(13);
root->left->left=newnode(1); 
root->left->right=newnode(6);
root->left->right->left=newnode(4);
root->left->right->right=newnode(7);
cout<<"input k\n";
cin>>k;
cout<<"Kth smallest element in the ";
cout<<"binary tree is :"<<endl; 
cout<< kthSmallest(root,k,count);
return 0;
}

Output

输出量

input k
4
Kth smallest element in the binary tree is :
6

翻译自: https://www.includehelp.com/icp/k-th-smallest-element-in-a-binary-search-tree.aspx

二叉搜索树中第k大元素

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

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

相关文章

阿里巴巴Java开发手册建议设置HashMap的初始容量,但设置多少合适呢?

作者 l Hollis来源 l Hollis&#xff08;ID&#xff1a;hollischuang&#xff09;集合是Java开发日常开发中经常会使用到的&#xff0c;而作为一种典型的K-V结构的数据结构&#xff0c;HashMap对于Java开发者一定不陌生。关于HashMap&#xff0c;很多人都对他有一些基本的了解&…

面向.Net程序员的dump分析

背景 Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。在 Windows 系统上&#xff0c; dump 文件分为内核 dump 和用户态 dump 两种。前者一般用来分析内核相关的问题&#xff0c;比如驱动程序&#xff1b;后者一般用来分析用户态程序的问题。 一般…

Linux Debian利用Dockefile将Python的py文件项目代码打包为Docker Podman镜像

1.创建PyCharm工程 使用PyCharm创建testHelloWorld工程&#xff0c;如下图所示&#xff1a; 2.选择本项目下的Python解释器 通过File -> Setting…选择解释器为本工程下的Python解释器。 【备注&#xff1a;一定要将项目python环境依赖存至本项目下&#xff0c;默认依赖本…

Java14发布!Switch竟如此简单?Lombok也不需要了?来用Idea搭建Java14吧!​

Java 14 在 2020.3.17 日发布正式版了&#xff0c;但现在很多公司还在使用 Java 7 或 Java 8&#xff0c;每当看到 Java 又发布新版本心里就慌得一匹。不过此版本并不是 LTS (长期支持版) 版本&#xff0c;所以不要慌&#xff0c;我们先来了解一下好了&#xff0c;等 LTS 版本发…

PyCharm更换pip源为国内源、模块安装、PyCharm依赖包导入导出教程

一、更换pip为国内源 1.使用PyCharm创建一个工程 2.通过File -> Setting…选择解释器为本工程下的Python解释器。 3.单击下图中添加“”&#xff0c; 4.单击下图中的“Manage Repositories”按钮&#xff0c; 6.目前国内靠谱的 pip 镜像源有&#xff1a; - 清华&#xff1…

Java14来了!Switch竟如此简单?Lombok也不需要了?来用Idea搭建Java14吧!

Java 14 在 2020.3.17 日发布正式版了&#xff0c;但现在很多公司还在使用 Java 7 或 Java 8&#xff0c;每当看到 Java 又发布新版本心里就慌得一匹。不过此版本并不是 LTS (长期支持版) 版本&#xff0c;所以不要慌&#xff0c;我们先来了解一下好了&#xff0c;等 LTS 版本发…

在线批量压缩JPG图片-JpegMini

2019独角兽企业重金招聘Python工程师标准>>> 之前有推荐过一个在线批量压缩PNG图片的网站TinyPng&#xff0c;这儿小觉再次推荐一个同类网站&#xff0c;专门在线批量压缩JPG图片的JpegMini。 当然&#xff0c;大家或者会说现在很多工具或者网站都有提供在线批量压缩…

《大厂内部资料》Redis 性能优化的 13 条军规!全网首发

这是我的第 43 篇原创文章。Redis 是基于单线程模型实现的&#xff0c;也就是 Redis 是使用一个线程来处理所有的客户端请求的&#xff0c;尽管 Redis 使用了非阻塞式 IO&#xff0c;并且对各种命令都做了优化&#xff08;大部分命令操作时间复杂度都是 O(1)&#xff09;&#…

Redis 性能优化的 13 条军规!史上最全

Redis 是基于单线程模型实现的&#xff0c;也就是 Redis 是使用一个线程来处理所有的客户端请求的&#xff0c;尽管 Redis 使用了非阻塞式 IO&#xff0c;并且对各种命令都做了优化&#xff08;大部分命令操作时间复杂度都是 O(1)&#xff09;&#xff0c;但由于 Redis 是单线程…

Linux Debian11 Podman容器常用命令

Podman 是一个开源的容器运行时项目&#xff0c;可在大多数 Linux 平台上使用。Podman 提供与 Docker 非常相似的功能。它不需要在你的系统上运行任何守护进程&#xff0c;并且它也可以在没有 root 权限的情况下运行。 Podman 可以管理和运行任何符合 OCI&#xff08;Open Con…

惊呆了,竟然可以用这种方式秒建Redis集群?

前面我们讲了《Redis 性能优化的 13 条军规&#xff01;》&#xff0c;其中最重要的一条就是使用 Redis 的集群功能&#xff0c;那么本文我们就来看看&#xff0c;如何用 1s 钟的时间来创建一个 Redis 集群。 Redis Cluster 是 Redis 3.0 版本推出的 Redis 集群方案&#xff0…

华为交换机S5735S-L24T4S-QA2无法telnet远程访问

以前都是按照https://datutu.blog.csdn.net/article/details/106810113方法配置不同网段通过静态路由实现互通,华为S5700交换机开启telnet远程指定IP登陆配置(强烈推荐),现在新买的华为数通智选交换机S5735S-L24T4S-QA2 也是按照这步骤配置,令人不解的是,竟然无法telnet访…

99%的程序员都在用Lombok,原理竟然这么简单?我也手撸了一个!|建议收藏!!!...

世界上只有一种英雄主义&#xff0c;就是看清生活的真相之后依然热爱生活。对于 Lombok 我相信大部分人都不陌生&#xff0c;但对于它的实现原理以及缺点却鲜为人知&#xff0c;而本文将会从 Lombok 的原理出发&#xff0c;手撸一个简易版的 Lombok&#xff0c;让你理解这个热门…

PyQt5中多线程模块QThread解决界面卡顿无响应问题,线程池ThreadPoolExecutor解决多任务耗时操作问题

使用多线程模块QThread可以解决PyQt5界面程序执行比较耗时操作时,程序卡顿出现的无响应以及界面输出无法实时显示的问题。 下面例子演示: 单击“运行”按钮,启动主线程,在子线程中采用线程池ThreadPoolExecuto解决ping多个IP耗时问题。在主界面把已ping过的IP添加到显示框…

干货!操作系统基础知识汇总!转给要面试的同学吧

作者&#xff1a;Guide哥来源&#xff1a;公众号 JavaGuide很多读者抱怨计算操作系统的知识点比较繁杂&#xff0c;自己也没有多少耐心去看&#xff0c;但是面试的时候又经常会遇到。所以&#xff0c;我带着我整理好的操作系统的常见问题来啦&#xff01;这篇文章总结了一些我觉…

eclipse的tomcat运行mave web项目

2019独角兽企业重金招聘Python工程师标准>>> 在eclipse中配置maven 安装成功后&#xff0c;就会多出Maven选项&#xff0c;在Installations中添加下载的Maven 在User Settings中配置本机的默认仓库 使用Eclipse的maven构建一个web项目 1、选择建立Maven Project 选…

Python在shell终端中显示进度条

Python在shell终端中显示进度条简单代码&#xff1a; from time import sleep from tqdm import tqdmmax 100 for i in tqdm(range(max)):sleep(0.1)效果如下&#xff1a;

没用过这些IDEA插件?怪不得写代码头疼

小伙伴们&#xff0c;大家好。今天准备和大家一起分享一下实际工作中常用的几款能提升幸福感和工作效率的IDEA插件吧&#xff0c;也欢迎小伙伴们在评论区安利出你们用过的觉得非常不错的插件&#xff0c;大家一起交流进步。1、Background Image Plus默认IDEA的背景一般都比较单…

颠覆与重构——戴尔助力徐工集团等行业客户实现业务转型

无论在IT领域&#xff0c;还是传统行业&#xff0c;颠覆与重构都是不可回避的话题。利用ICT领域的技术创新与互联网思维&#xff0c;传统企业可以更好地实现业务转型与创新。阿里集团与上汽共研互联网汽车&#xff0c;东软致力于推动远程医疗新模式&#xff0c;Mock颠覆传统学习…

Linux多命令顺序执行与管道符

1.多命令顺序执行 实例测试&#xff1a; 2.管道符 实例测试&#xff1a; 3.grep命令 实例测试&#xff1a; 获取更多技术干货&#xff0c;请访问大土土随笔 如果本文对您有所帮助&#xff0c;请关注微信公众号“捷创源科技”。