dfs 二叉树中序遍历迭代解法——求解BST中第k小元素
BST中第K小的元素
中文English
给一棵二叉搜索树,写一个 KthSmallest
函数来找到其中第 K 小的元素。
Example
样例 1:
输入:{1,#,2},2
输出:2
解释:
1
\
2
第二小的元素是2。
样例 2:
输入:{2,1,3},1
输出:1
解释:
2
/ \
1 3
第一小的元素是1。
Challenge
如果这棵 BST 经常会被修改(插入/删除操作)并且你需要很快速的找到第 K 小的元素呢?你会如何优化这个 KthSmallest 函数?
Notice
你可以假设 k 总是有效的, 1 ≤ k ≤ 树的总节点数
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | """ Definition of TreeNode: class TreeNode: def __init__(self, val): self.val = val self.left, self.right = None, None """ class Solution: """ @param root: the given BST @param k: the given k @return: the kth smallest element in BST """ """ nth = 0 result = None def kthSmallest(self, root, k): # write your code here self.dfs(root, k) return self.result def dfs(self, root, k): if not root: return self.dfs(root.left, k) self.nth += 1 if self.nth == k: self.result = root.val self.dfs(root.right, k) """ """ template: TreeNode pNode = root; while (!s.isEmpty() || pNode != null) { if (pNode != null) { s.push(pNode); pNode = pNode.left; } else { pNode = s.pop(); result.add(pNode.val); pNode = pNode.right; } } """ def kthSmallest( self , root, k): if not root: return None q = [] node = root nth = 0 while q or node: if node: q.append(node) node = node.left else : node = q.pop() nth + = 1 if nth = = k: return node.val node = node.right return None |
86. 二叉查找树迭代器
中文
English
设计实现一个带有下列属性的二叉查找树的迭代器:
next()返回BST中下一个最小的元素
- 元素按照递增的顺序被访问(比如中序遍历)
next()
和hasNext()
的询问操作要求均摊时间复杂度是O(1)
样例
样例 1:
输入:{10,1,11,#,6,#,12}
输出:[1, 6, 10, 11, 12]
解释:
二叉查找树如下 :
10
/\
1 11
\ \
6 12
可以返回二叉查找树的中序遍历 [1, 6, 10, 11, 12]
样例 2:
输入:{2,1,3}
输出:[1,2,3]
解释:
二叉查找树如下 :
2
/ \
1 3
可以返回二叉查找树的中序遍历 [1,2,3]
挑战
额外空间复杂度是O(h),其中h是这棵树的高度
Super Star:使用O(1)的额外空间复杂度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | """ Definition of TreeNode: class TreeNode: def __init__(self, val): self.val = val self.left, self.right = None, None Example of iterate a tree: iterator = BSTIterator(root) while iterator.hasNext(): node = iterator.next() do something for node """ class BSTIterator: """ @param: root: The root of binary tree. """ def __init__( self , root): # do intialization if necessary self .q = [] self .node = root """ @return: True if there has next node, or false """ def hasNext( self , ): # write your code here return self .node or self .q """ @return: return next node """ def next ( self , ): # write your code here while self .node or self .q: if self .node: self .q.append( self .node) self .node = self .node.left else : cur_node = self .q.pop() self .node = cur_node.right return cur_node return None |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2018-09-29 xrat CC特征
2017-09-29 【转】dig详解
2017-09-29 dig linux下的使用
2017-09-29 DNS RR代码和含义
2017-09-29 spark 卡在spark context,运行出现spark Exception encountered while connecting to the server : javax.security.sasl.SaslException