问题:给定一个二叉搜索树(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);
}
}
历史题

如何实现一个高效的单向链表逆序输出?

求 sqrt (2)精确到小数点后 10 位

给定一个二叉搜索树(BST),找到树中第 K 小的节点的更多相关文章

  1. 2020-07-31:给定一个二叉搜索树(BST),找到树中第K 小的节点。

    福哥答案2020-07-31: BST 的中序遍历是升序序列.1.递归法.时间复杂度:O(N),遍历了整个树.空间复杂度:O(N),用了一个数组存储中序序列.2.迭代法.时间复杂度:O(H+k),其中 ...

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

    一个被广泛使用的面试题: 给定一个二叉搜索树,请找出其中的第K个大的结点. PS:我第一次在面试的时候被问到这个问题而且让我直接在白纸上写的时候,直接蒙圈了,因为没有刷题准备,所以就会有伤害.(面完的 ...

  3. 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用

    一般来说,删除节点可分为两个步骤: 首先找到需要删除的节点: 如果找到了,删除它. 说明: 要求算法时间复杂度为 O(h),h 为树的高度. 示例: root = [5,3,6,2,4,null,7] ...

  4. C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解

    剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...

  5. 萌新笔记之二叉搜索树(BST)

    前言,以前搞过线段树,二叉树觉得也就那样= =.然后数据结构的课也没怎么听过,然后下周期中考... 本来以为今天英语考完可以好好搞ACM了,然后这个数据结构期中考感觉会丢人,还是好好学习一波. 二叉搜 ...

  6. hdu 3791:二叉搜索树(数据结构,二叉搜索树 BST)

    二叉搜索树 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submiss ...

  7. HDU 3999 The order of a Tree 二叉搜索树 BST

    建一个二叉搜索树,然后前序输出. 用链表建的,发现很久没做都快忘了... #include <cstdio> #include <cstdlib> struct Node{ i ...

  8. 数据结构☞二叉搜索树BST

    二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它可以是一棵空树,也可以是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它 ...

  9. 看动画学算法之:二叉搜索树BST

    目录 简介 BST的基本性质 BST的构建 BST的搜索 BST的插入 BST的删除 简介 树是类似于链表的数据结构,和链表的线性结构不同的是,树是具有层次结构的非线性的数据结构. 树是由很多个节点组 ...

随机推荐

  1. CentOS下安装mysql-server提示No package mysql-server avaliable

    出现这个原因是CentOS使用mariadb-server代替掉了mysql-server,因此如果想使用mysql-server需要先更新仓库地址,使用以下命令: wget http://repo. ...

  2. django AJAX 的应用

    目录 AJAX 的使用 AJAX简介 AJAX常见应用情景 AJAX的优缺点 jQuery实现的AJAX JS实现AJAX AJAX请求如何设置csrf_token Form表单上传文件 AJAX上传 ...

  3. paroot忘记root密码

    打开虚拟机在倒计时进入系统前按下e键然后按照下图修改即可 crtl+x重启 mount –rw –o remount /保证磁盘可读写 然后执行passwd

  4. git 命令提交项目到git服务器

    1.先下载git,然后安装git https://git-scm.com/downloads 2.在电脑任意盘创建一个目录 3.在创建的目录下点击右键 4.初始化git 使用git init 初始化, ...

  5. vue入门模板——只需一个html

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. SpringBoot 中的使用事务

    转自:https://blog.csdn.net/linzhiqiang0316/article/details/52638039 什么是事务? 我们在开发企业应用时,对于业务人员的一个操作实际是对数 ...

  7. 学习python的日常7

    ---恢复内容开始--- 正则表达式: 在正则表达式中,用\d可以匹配一个数字,\w可以匹配一个字母或数字,'.'可以匹配任意字符,用*表示任意个字符,用+表示至少一个字符,用?表示0个货一个字符,用 ...

  8. Access、Trunk和Hybrid三种端口模式

    网络交换机(英语:Network switch)是一个扩大网络的器材,能为子网中提供更多的连接端口,以便连接更多的电脑. 通俗来说其起到的作用就是把一个网络端口分成多个网络端口 交换机和路由器的区别 ...

  9. linux ssh_config和sshd_config配置文件学习

    在远程管理linux系统基本上都要使用到ssh,原因很简单:telnet.FTP等传输方式是‍以明文传送用户认证信息,本质上是不安全的,存在被网络窃听的危险.SSH(Secure Shell)目前较可 ...

  10. 《代码敲不队》第九次团队作业:Beta冲刺与验收准备

    项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 代码敲不队 作业学习目标 (1)掌握软件测试基础技术(2)学习迭代式增量软件开发过程(Scrum) ...