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
        

 

posted @   bonelee  阅读(678)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.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
点击右上角即可分享
微信分享提示