[leetcode] 230. Kth Smallest Element in a BST 找出二叉搜索树中的第k小的元素
题目大意
https://leetcode.com/problems/kth-smallest-element-in-a-bst/description/
230. Kth Smallest Element in a BST
Given a binary search tree, write a function kthSmallest to find the kth smallest element in it.
Note:
You may assume k is always valid, 1 ≤ k ≤ BST's total elements.
Example 1:
Input: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
Output: 1
Example 2:
Input: root = [5,3,6,2,4,null,null,1], k = 3
5
/ \
3 6
/ \
2 4
/
1
Output: 3
Follow up:
What if the BST is modified (insert/delete operations) often and you need to find the kth smallest frequently? How would you optimize the kthSmallest routine?
给定一棵二叉搜索树(BST),编写一个函数kthSmallest找出其中第k小的元素。
注意:
你可以假设k总是有效的, 1 ≤ k ≤ BST的元素总数。
进一步思考:
如果BST的修改(插入/删除)操作十分频繁,并且需要频繁地找出第k小的元素,应该怎样优化kthSmallest函数?
解题思路
BST具有如下性质:
- 左子树中所有元素的值均小于根节点的值
- 右子树中所有元素的值均大于根节点的值
因此采用中序遍历(左 -> 根 -> 右)即可以递增顺序访问BST中的节点,从而得到第k小的元素,时间复杂度O(k)
Python代码:
# Definition for a binary tree node.
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None class Solution(object):
def kthSmallest(self, root, k): # 52 ms
"""
:type root: TreeNode
:type k: int
:rtype: int
"""
stack = []
node = root
while node:
stack.append(node)
node = node.left
x = 1
while stack and x <= k:
node = stack.pop()
x += 1
right = node.right
while right:
stack.append(right)
right = right.left
return node.val
递归方式:
class Solution(object):
def kthSmallest(self, root, k):
"""
:type root: TreeNode
:type k: int
:rtype: int
"""
cnt = []
self.helper(root, cnt, k)
return cnt[k - 1] def helper(self, node, cnt, k):
if not node:
return None
self.helper(node.left, cnt, k)
cnt.append(node.val)
if len(cnt) == k: # 56 ms <= 96ms
return None
self.helper(node.right, cnt, k)
进一步思考:
如果BST节点TreeNode的属性可以扩展,则再添加一个属性leftCnt,记录左子树的节点个数
记当前节点为node
当node不为空时循环:
若k == node.leftCnt + 1:则返回node
否则,若k > node.leftCnt:则令k -= node.leftCnt + 1,令node = node.right
否则,node = node.left
上述算法时间复杂度为O(BST的高度)
参考
http://bookshadow.com/weblog/2015/07/02/leetcode-kth-smallest-element-bst/
https://leetcode.com/problems/kth-smallest-element-in-a-bst/discuss/63660/3-ways-implemented-in-JAVA-(Python):-Binary-Search-in-order-iterative-and-recursive
[leetcode] 230. Kth Smallest Element in a BST 找出二叉搜索树中的第k小的元素的更多相关文章
- [LeetCode] 230. Kth Smallest Element in a BST 二叉搜索树中的第K小的元素
Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...
- [LeetCode] Kth Smallest Element in a BST 二叉搜索树中的第K小的元素
Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...
- [LeetCode] 230. Kth Smallest Element in a BST 解题思路
Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...
- Leetcode 230. Kth Smallest Element in a BST
Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...
- (medium)LeetCode 230.Kth Smallest Element in a BST
Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...
- Java for LeetCode 230 Kth Smallest Element in a BST
解题思路: 直接修改中序遍历函数即可,JAVA实现如下: int res = 0; int k = 0; public int kthSmallest(TreeNode root, int k) { ...
- LeetCode 230 Kth Smallest Element in a BST 二叉搜索树中的第K个元素
1.非递归解法 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * ...
- LeetCode 230. Kth Smallest Element in a BST 动态演示
返回排序二叉树第K小的数 还是用先序遍历,记录index和K进行比较 class Solution { public: void helper(TreeNode* node, int& idx ...
- 【LeetCode】230. Kth Smallest Element in a BST (2 solutions)
Kth Smallest Element in a BST Given a binary search tree, write a function kthSmallest to find the k ...
随机推荐
- 转载:负载均衡器技术Nginx和F5的优缺点对比
https://blog.csdn.net/zxc456733/article/details/78861100 nginx(一) nginx详解 nginx是一个被广泛使用的集群架构组件,我们有必要 ...
- 直接通过OptionalAttribute, DefaultParameterValueAttribute定义缺省参数
- spring boot开发 静态资源加载不出来
spring boot 1.5 版本之前 不拦截静态资源 springboot 2.x版本 拦截静态资源 private static final String[] CLASSPATH_RESOURC ...
- C# int.ToString() 常用参数说明
C#中int类型的ToString()方法有个重载是输入一个字符串,这个字符串可以对int进行部分格式化操作,如上.
- English trip -- MC(情景课)3 D
xu言: have a nice weekend... sentences How many people are there in you family? they are 3 people in ...
- 20170719xlVbaAbsorbProcedure
Sub AbsorbThisProcedure() If Application.VBE.MainWindow.Visible = False Then MsgBox "请先激活VBE编辑窗 ...
- Andriod的Http请求获取Cookie信息并同步保存,使第二次不用登录也可查看个人信息
Android使用Http请求登录,则通过登录成功获取Cookie信息并同步,可以是下一次不用登录也可以查看到个人信息, 注:如果初始化加载登录,可通过缓存Cookie信息来验证是否要加载登录界面.C ...
- DATEADD 和 CAST 函数
where cast(soh.orderdate as date)=cast(dateadd(day,-1,getdate()) as date) 这一代码在sql 2005 不适用,使用conver ...
- PL/SQL Developer 一段时间后变慢,且导致数据库CPU100%的问题(转)
参考: 一段时间不用plsql developer之后重新使用会变得很慢 plsql developer连接数据库导致服务器cpu升高的案例 1.pl/sql dev 变慢的问题,建议设置如下 2. ...
- bootstrap modal关闭滚动条自动会跳回最顶端问题记录
原因:使用了a标签当按钮触发modal关闭的时候就会自动跳回浏览器最顶端 解决方案: 不要使用a标签就行了