给一棵二叉搜索树,写一个 KthSmallest
函数来找到其中第 K 小的元素。
样例 1:
输入:{1,#,2},2
输出:2
解释:
1
2
第二小的元素是2。
样例 2:
输入:{2,1,3},1
输出:1
解释:
2
/ 1 3
第一小的元素是1。
如果这棵 BST 经常会被修改(插入/删除操作)并且你需要很快速的找到第 K 小的元素呢?你会如何优化这个 KthSmallest 函数?
你可以假设 k 总是有效的, 1 ≤ k ≤ 树的总节点数
。
""" 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
原文:https://www.cnblogs.com/bonelee/p/11610292.html