给定一个二叉搜索树(BST),找到树中第 K 小的节点
问题:给定一个二叉搜索树(BST),找到树中第 K 小的节点。
出题人:阿里巴巴出题专家:文景/阿里云 CDN 资深技术专家。
考察点:
1. 基础数据结构的理解和编码能力
2. 递归使用
参考答案:
5
/ \
3 6
/ \
2 4
/
1
说明:保证输入的 K 满足 1<=K<=(节点数目)
树相关的题目,第一眼就想到递归求解,左右子树分别遍历。联想到二叉搜索树的性质,root 大于左子树,小于右子树,如果左子树的节点数目等于 K-1,那么 root 就是结果,否则如果左子树节点数目小于 K-1,那么结果必然在右子树,否则就在左子树。因此在搜索的时候同时返回节点数目,跟 K 做对比,就能得出结果了。
/**
* Definition for a binary tree node.
**/ public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
} class Solution {
private class ResultType { boolean found; // 是否找到 int val; // 节点数目
ResultType(boolean found, int val) {
this.found = found;
this.val = val;
}
} public int kthSmallest(TreeNode root, int k) {
return kthSmallestHelper(root, k).val;
} private ResultType kthSmallestHelper(TreeNode root, int k) {
if (root == null) {
return new ResultType(false, 0);
} ResultType left = kthSmallestHelper(root.left, k); // 左子树找到,直接返回
if (left.found) {
return new ResultType(true, left.val);
} // 左子树的节点数目 = K-1,结果为 root 的值
if (k - left.val == 1) {
return new ResultType(true, root.val);
} // 右子树寻找
ResultType right = kthSmallestHelper(root.right, k - left.val - 1);
if (right.found) {
return new ResultType(true, right.val);
} // 没找到,返回节点总数
return new ResultType(false, left.val + 1 + right.val);
}
}
历史题目
给定一个二叉搜索树(BST),找到树中第 K 小的节点的更多相关文章
- 2020-07-31:给定一个二叉搜索树(BST),找到树中第K 小的节点。
福哥答案2020-07-31: BST 的中序遍历是升序序列.1.递归法.时间复杂度:O(N),遍历了整个树.空间复杂度:O(N),用了一个数组存储中序序列.2.迭代法.时间复杂度:O(H+k),其中 ...
- 在二叉搜索树(BST)中查找第K个大的结点之非递归实现
一个被广泛使用的面试题: 给定一个二叉搜索树,请找出其中的第K个大的结点. PS:我第一次在面试的时候被问到这个问题而且让我直接在白纸上写的时候,直接蒙圈了,因为没有刷题准备,所以就会有伤害.(面完的 ...
- 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用
一般来说,删除节点可分为两个步骤: 首先找到需要删除的节点: 如果找到了,删除它. 说明: 要求算法时间复杂度为 O(h),h 为树的高度. 示例: root = [5,3,6,2,4,null,7] ...
- C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解
剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...
- 萌新笔记之二叉搜索树(BST)
前言,以前搞过线段树,二叉树觉得也就那样= =.然后数据结构的课也没怎么听过,然后下周期中考... 本来以为今天英语考完可以好好搞ACM了,然后这个数据结构期中考感觉会丢人,还是好好学习一波. 二叉搜 ...
- hdu 3791:二叉搜索树(数据结构,二叉搜索树 BST)
二叉搜索树 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submiss ...
- HDU 3999 The order of a Tree 二叉搜索树 BST
建一个二叉搜索树,然后前序输出. 用链表建的,发现很久没做都快忘了... #include <cstdio> #include <cstdlib> struct Node{ i ...
- 数据结构☞二叉搜索树BST
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它可以是一棵空树,也可以是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它 ...
- 看动画学算法之:二叉搜索树BST
目录 简介 BST的基本性质 BST的构建 BST的搜索 BST的插入 BST的删除 简介 树是类似于链表的数据结构,和链表的线性结构不同的是,树是具有层次结构的非线性的数据结构. 树是由很多个节点组 ...
随机推荐
- JS中的函数与对象
创建函数的三种方式 1.函数声明 function calSum1(num1, num2) { return num1 + num2; } console.log(calSum1(10, 10)); ...
- 各种GAN的学习和总结
GAN: https://www.cnblogs.com/kk17/p/10046884.html WGAN: https://www.cnblogs.com/Allen-rg/p/10305125. ...
- org.apache.commons.beanutils.ConversionException: No value specified解决办法
转自:https://www.cnblogs.com/linjiqin/archive/2011/07/21/2112628.html 当用到了java.sql.Date时间等非内置对象时,如果对象为 ...
- c#指定长度切割字符串,返回数组
public List<string> subStringByCount(string text, int count) { ;//开始索引 ;//结束索引 double count_va ...
- Invalid escape sequence at line 1 column 29 path $[0].name
编译报错:Invalid escape sequence at line 1 column 29 path $[0].name 解决:grade.properties 文件下 org.gradle.j ...
- Mysql学习之事务的隔离性
今天咱们说说事务,相信大家都知道事务的 ACID (Atomicity.Consistency.Isolation.Durability,即原子性.一致性.隔离性.持久性). 原子性:表示一个事务不可 ...
- MySQL Transaction--网络丢包导致长时间未提交事务
TCP三次握手(Three-Way Handshake) 建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立. TCP三次握手:第一次握手:Client将标志位SYN置为1,随机产 ...
- CentOS7- ABRT has detected 1 problem(s). For more info run: abrt-cli list --since 1548988705
CentOS7重启后,xshell连接,后出现ABRT has detected 1 problem(s). For more info run: abrt-cli list --since 1548 ...
- SQL SERVER-解析Extendevent文件数据
--解析xel数据 select SWITCHOFFSET(n.value('@timestamp','Datetime'),'+08:00') as EventTime, n.value('(dat ...
- PHP SplQueue 实现队列
$que = new SplQueue(); $que->enqueue("a");//入队列 $que->enqueue("b"); $que-& ...