[面试题]找BST中的第K大结点

【LintCode题解】谷歌面试题:BST中第K小的元素 题目描述 给一棵二叉搜索树,写一个KthSmallest函数来找到其中第 K 小的元素。 样例 1: 输入:{1,#,2},2 输出:2 解释: 1 \ 2 第二小的元素是2。 样例 2: 输入:{2,1,3},1 输出:1 解释: 2 / \ 1 3 第一小的元素是1。 题解 时间复杂度O(n)最好最坏都是。 算法思想类似于 Quick Sele... 阅读详情

上次参加微信一面的笔试中的最后一道。当时考虑了递归,觉得效率不好,犹豫中没做完,不甘心所以回学校又写了一遍。主要使用栈,核心代码特别简单。如图:

 

完整的源码如下:

#include <iostream>
using namespace std;

struct Node
{
	int value;
	Node * left;
	Node * right;
};
struct BST
{
	Node * root;
};
void insert_tree(Node * root,Node * node)
{
	if(root == 0 || node == 0)
		return;
	Node * pos = root;
	Node * parent = root;
	while(pos != 0)
	{
		parent = pos;
		if(node->value < pos->value)
		{
			pos = pos->left;
		}else
		{
			pos = pos->right;
		}
	}
	//insert left
	if(node->value < parent->value)
	{
		parent->left = node;
	}else//insert right
	{
		parent->right = node;
	}

};
//preorder traverse the tree
void print_tree(Node * root)
{
	if(root == 0)
		return;
	cout << root->value << " ";
	print_tree(root->left);
	print_tree(root->right);
}
void destroy_tree(Node * root)
{
	if(root == 0)
		return;
	destroy_tree(root->left);
	destroy_tree(root->right);
	delete root;
}
int main()
{
	cout << "Input the number of node in the BST: ";
	int nodes;
	cin >> nodes;
	BST bst;//create a binary search tree
	bst.root = 0;
	cout << "Input the nodes: " << endl;
	for(int i = 0;i < nodes;i++)
	{
		Node * node = new Node;
		cin >> node->value;
		node->left = 0;
		node->right = 0;
		if(bst.root == 0)
		{
			bst.root = node;
			continue;
		}
		insert_tree(bst.root,node);
	}
	print_tree(bst.root);
	cout << endl;
	int kth = 0;
	cout << "Input the kth: ";
	cin >> kth;
	if(kth <= 0 || kth > nodes)
	{
		cout << "Input Error!" << endl;
		return -1;
	}
	//find the kth node, then print it
	Node * pos = bst.root;
	Node ** stack = new Node*[nodes];
	//the top of stack
	int top = 0;	
	while(kth > 0)
	{
		if(pos != 0)
		{
			//push
			 stack[top] = pos;
			top++;
			pos = pos->right;
		}else
		{
			//pop
			top--;
			kth--;
			//go to the left child
			pos = stack[top]->left;
		}
	}
	//print the kth max value
	cout << stack[top]->value << endl;

	//free the memory
	destroy_tree(bst.root);
	delete [] stack;

	system("pause");
	return 0;

}


 

C++进阶——二叉搜索树BST 阅读详情

相关推荐

阿里开发者招聘节 | 面试题02-04:给定一个二叉搜索树(BST),找到树中第K小的节点

为帮助开发者们提升面试技能、有机会入职阿里,云栖社区特别制作了这个专辑——阿里巴巴资深技术专家们结合多年的工作、面试经验总结提炼而成的面试真题这一次将陆续放出(面试题官方参考答案将在专辑结束后统一汇总分享,点此进入答题并围观他人答案)。并通过这些笔试真题开放阿里巴巴工作机会,让更多的开发者加入到阿里这个大平台。 这一次,不仅是知识的收获,还将间接地与技术大牛们做了直观的沟通,了解他们的出题思路与...

阿里云云栖号 1808

【leetcode/BST】数据流中的第k大元素(BST综合+优先队列引入)

问题描述: 设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数据流中的初始元素。每次调用 KthLargest.add,返回当前数据流中第K大的元素。 示例: int k = 3; int[] arr = [4,5,8,2]; KthLargest...

qq_43338695的博客 286

华为Atlas 300I推理卡驱动安装避坑指南:不同安装方式的选择与优化

本文详细解析华为Atlas 300I推理卡驱动安装的三种主流方式(.run、.rpm和源码编译),提供关键环境检查步骤、安装流程优化建议及常见问题解决方案,帮助开发者高效完成芯片推理卡部署并规避典型安装陷阱。

q9w8e7r6t5的博客 431

在二叉搜索树(BST)中查找第K个大的结点之非递归实现

一个被广泛使用的面试题: 给定一个二叉搜索树,请找出其中的第K个大的结点。 PS:我第一次在面试的时候被问到这个问题而且让我直接在白纸上写的时候,直接蒙圈了,因为没有刷题准备,所以就会有伤害。知耻而后勇,于是我回家花了两个半小时(在不参考任何书本和网路上的源码的前提下),从构建BST开始,到实现中序遍历,最后用递归方法写出bst_findKthNode()并用gdb调试成功。 不过,使...

weixin_30797027的博客 302

STM32CubeIDE入坑指南

一 前言 在科技日新月异的今天,作为从事效率为先的苦逼 IT 行业,秉承着我不入地狱谁入地狱的伟大革命精神,我决定再一次做第一个吃螃蟹的人,通过自身的入坑过程,为大家测试STM32CubeIDE这款新式工具。(其实是为了我能省点时间,快点做完项目,多挣点钱买几瓶肾气丸) 二 看一看别人是如何入坑的 二 手把手带你入坑 三 相关资料 ...

CH的博客 1万+

Ubuntu安装ToDesk远程控制软件

前几天有同学问我怎么在 Ubuntu 系统上安装 ToDesk 远程控制软件, 帮他安装完成后就 顺手整理了一下安装过程,所以就顺手有了这篇在 Ubuntu 系统上安装 todesk 的文章。

小白的博客 8659

阿里开发者招聘节 | 面试题02-04:给定一个二叉搜索树(BST),找到树中第K小的节点 ...

为帮助开发者们提升面试技能、有机会入职阿里,云栖社区特别制作了这个专辑——阿里巴巴资深技术专家们结合多年的工作、面试经验总结提炼而成的面试真题这一次将陆续放出(面试题官方参考答案将在专辑结束后统一汇总分享,点此进入答题并围观他人答案)。并通过这些笔试真题开放阿里巴巴工作机会,让更多的开发者加入到阿里这个大平台。 这一次,不仅是知识的收获,还将间接地与技术...

测试0901-1 1166

【硬件】通俗易懂的讲解晶体管(三极管和MOS管)的工作原理

晶体管是一个简单的元器件,可用于构建许多有趣的项目。在本文中,我将用通俗易懂的语言给您讲解晶体管的工作原理,以便您可以在电路设计中更好的使用静态管。一旦你学习这些基础知识,对以后的设计和使用来说,将会变得非常容易。我们将重点介绍两种最常见的晶体管:双极型晶体管(三极管)和MOSFET。晶体管的工作原理其实是类似于电子开关。它可以打开和关闭电路。一个简单的思考方法是将晶体管视为无源的继电器。晶体管类似于继电器,从某种意义上说,您可以使用它来打开和关闭某些东西。但晶体管也可以部分导通,一般在放大电路中使用,这部

1万+

在BST中找到第k大的数

找出BST中第k大的数: 如果中序遍历BST(左子树->根节点->右子树)可以得到从小到大的数字序列。要求第k大的元素,得到从大到小的数字序列最好了。根据前面的提示访问顺序为右子树->根节点->左子树时得到从大到小的数字序列。 不过为了求取第k大的数,可以在访问完之后,将计数器自增  count++,如果count等于k输出这个数。大于k时返回错误。 struct Node {

f81892461的专栏 4435

HFSS螺旋线圈的优化设计与高效仿真实践

本文详细介绍了HFSS螺旋线圈的优化设计与高效仿真实践,涵盖核心参数设置、参数化建模、仿真加速技巧及结果分析。通过HFSS软件实现螺旋线圈的高效仿真,特别适用于无线充电和RFID系统设计,提升设计效率与性能验证准确性。

weixin_30235225的博客 445

Linux下用SquareLine Studio开发LVGL界面:从安装到实战的完整避坑指南

本文提供了一份在Linux系统下使用SquareLine Studio开发LVGL图形界面的完整实战指南。内容涵盖从SDL库安装、SquareLine Studio环境配置、界面可视化设计,到工程导出、源码编译及常见错误排查的全流程。重点解析了如何将设计界面无缝集成到Linux开发流程中,并针对嵌入式设备移植提供了关键步骤,旨在帮助开发者高效避坑,快速上手LVGL界面开发。

egg99的博客 905

二叉搜索树(BST)的第k大节点

给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。 利用BST中序有序的性质 中序遍历二叉树,依次将节点存入result,则result[k-1]是我们寻找的节点 设置一个标识k,遇到一个节点k++,中序遍历二叉树,当k=搜索数时返回正在访问的节点 # -*- coding:utf-8 ...

北歌的博客 1017

MTK手机传感器驱动开发避坑指南:从SCP代码大小限制到Overlay加载流程详解

本文详细解析了MTK平台传感器驱动开发中的常见问题,包括SCP代码大小限制、Overlay加载流程及客制化传感器集成。通过实战案例和优化策略,帮助开发者高效解决MTK传感器驱动开发中的技术难题,提升开发效率。

weixin_42522374的博客 401

面试题54. 二叉搜索树的第k大节点

Problem 给定一棵二叉搜索树,请找出其中第k大的节点。 Example 1 Example 2 Solution Solution1 利用BST中序遍历为递增序列的特性,将遍历结果储存在数组中,然后从后向前找到第k个数。 Solution2 BST反向中序遍历(右->中->左)的结果是递减序列。所以在反向中序过程中,记录当前遍历的是第几个节点,当遍历到第k个时,就是结果。 /...

Bryan要加油 743

2、微软 Power Automate 入门指南

本文是一篇关于微软 Power Automate 的入门指南,详细介绍了 Power Automate 的基本概念、相关术语、登录方式以及如何创建一个简单的自动化流。文章还探讨了 Power Automate 在业务流程中的应用场景和优势,并展望了其高级功能和未来发展。适合希望快速入门 Power Automate 并提升业务自动化效率的读者。

corn8的博客 442

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【剑指offer】面试题54. 二叉搜索树的第k大节点

解题思路 中序遍历BST,序列是从小到大排列的,而逆中序遍历,结果是从大到小排列的,在遍历过程中记录该结点属于第几个并和k比较,如果是则保持结果,最后返回的结果即为答案 代码 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * Tre...

Do Better 269

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

二叉搜索树的第k个结点-C++

// 面试题54:二叉搜索树的第k个结点 // 题目:给定一棵二叉搜索树,请找出其中的第k大的结点。 #include struct BinaryTreeNode { int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight; }; BinaryTreeNode *CreateBinaryTreeNode(int value) { BinaryTreeNode *pNode = ne

了解➔熟悉➔掌握➔精通 661

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【二叉树】BST的第k大结点,二叉树的深度,平衡二叉树

面试题54:二叉搜索树的第k个结点 给定一棵二叉搜索树,请找出其中的第k大的结点。 左边都比中间小,右边都比中间大,所以用中序遍历(左中右)就可以实现按结点的值从小到大遍历,遍历时候进行计数即可。 #include&amp;lt;bits/stdc++.h&amp;gt; #include &quot;../Utilities/BinaryTree.h&quot; using namespace std; //递归函数:输入...

大桔骑士的学习笔记 1333

【BST二叉搜索树】常见笔试题

文章目录【1】树的镜像翻转【2】判断一棵二叉树是不是一棵BST树【3】寻找BST树指定区间的元素结果集 【1】树的镜像翻转 //树的镜像翻转 void mirror() { cout << "镜像翻转:"; mirror(_root); //调用以根节点进行镜像翻转 } void mirror(BSTNode *node) { if (node == nullp...

Lebron 2172

BST树 面试题(Java)

文章目录求BST树的镜像反转把bst树中满足[begin,end]区间的所有元素打印出来 求BST树的镜像反转 镜像的意思很明显,就是左右交换,举个例子: 镜像后: 检验代码编写是否正确可以通过树的中序遍历,搜索二叉树的中序遍历是一个严格的升序,镜像后是一个严格的逆序。 思路:通过递归遍历的过程,不断的交换左右子树,直到叶子节点。这样遍历完成后,所有的左右子树都被交换了一遍,就实现了镜像。 实...

博客 771

阿里面试题 给定一个二叉搜索树(BST),找到树中第 K 小的节点

解法1:树相关的题目,第一眼就想到递归求解,左右子树分别遍历。联想到二叉搜索树的性质,root 大于左子树,小于右子树,如果左子树的节点数目等于 K-1,那么 root 就是结果,否则如果左子树节点数目小于 K-1,那么结果必然在右子树,否则就在左子树。因此在搜索的时候同时返回节点数目,跟 K 做对比,就能得出结果了。解法2:基于二叉搜索树的特性,在中序遍历的结果中,第k个元素就是本题的解。遍历并不是需要全部做完,使用计数的方式,找到第k个元素就可以退出。最差的情况是k节点是bst的最右叶子节点,不过。

zy19155268651的博客 261

【简单】面试题54. 二叉搜索树的第k大节点

【题目】 给定一棵二叉搜索树,请找出其中第k大的节点。 来源:leetcode 链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/ 【示例】 输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \ 2 【思路】 1、 二叉树的中序遍历的拟状态,正常二叉树的中序遍历是LNR,而其逆状态是RNL 2、根据题目要求可知,需要找到第k大的数字并返回,由于BST二叉搜索树

... 244

BST树面试常见问题

一、二叉树和BST树理论 二、BST树插入删除查询操作 1. 非递归插入操作 2. 非递归删除操作 3. 代码 4. 递归插入查询和删除代码 三、BST树前中后序遍历 1. 前中后序遍历的递归方法 2. 前中后序遍历的非递归实现 四、BST树层次遍历 1. 递归实现 2. 非递归实现 四、常见面试题 1. BST树区间元素查找 2. 判断一棵树是否是二叉搜索树 3. BST树求子树问题 4. 二叉搜索树最近公共祖先LCA 5. 求镜像翻转 6. 判断镜像对称 7. 前序中序遍历重建二叉树 8. 判断二叉树是

qq_41721746的博客 1197

BST二叉搜索树常见遍历操作以及面试常见编程题

二叉搜索树

长期更新自学笔记 1171

【刷题日记】树的那些事儿(四)——二叉搜索树BST

树的那些事儿(一)——基础操作 树的那些事儿(二)——重建一棵树 题目: 返回一棵二叉搜索树的第k小结点 考察点: 二叉搜索树的特点:左子树≤根结点≤右子树(左-根-右顺序) 如何按照二叉搜索树的排序进行遍历:中序遍历 返回树的中序遍历的第k个结点即可。直接上代码,不知道中序遍历怎么写的请参阅添加链接描述 注意一下边界 可见啊,树的基本操作真的太太太太重要了啊! def KthNode(s...

marvellousxf的博客 161

二叉搜索树找第K小的树

百度面试题 题目描述: 给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。 题目来源:牛客网 代码实现(python2) # -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # ...

changqing1234的专栏 436
上一篇: python编写shell脚本详细讲解
下一篇: 设计模式——单例模式Singleton
Scutware
博客等级 码龄14年 4粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值