230._kth_smallest_element_in_a_bst.md 1.3 KB
Newer Older
1
### 230. Kth Smallest Element in a BST
K
KEQI HUANG 已提交
2 3 4 5 6 7 8 9 10 11 12 13 14 15

题目:
<https://leetcode.com/problems/kth-smallest-element-in-a-bst/>


难度:
Medium


跟昨天做的一道题类似,一上来就走取巧之路。

InOrder排序,输出,当然也完全可以用昨天的binary tree iterator,入stack,出stack,直到输出第k位


16
```python
K
KEQI HUANG 已提交
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
class Solution(object):
    def kthSmallest(self, root, k):
        """
        :type root: TreeNode
        :type k: int
        :rtype: int
        """
        self.root = root
        self.lst = []
        self.inOrder(root)
        return self.lst[k-1]

    def inOrder(self, root):
        if root == None:
            return
        self.inOrder(root.left)
        self.lst.append(root.val)
K
KEQI HUANG 已提交
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
        self.inOrder(root.right)
```


现在看到kth 就条件反射的想用divide & conquer, 扫root的左子树看nodes量,如果nodes数量是k-1,那么node就刚好是第k个,如果大于k > 左子树数量,扫右子树,同时更新root为root.right。

看到的言论:

> If we can change the BST node structure, We can add a new Integer to mark the number of element in the left sub-tree.

when the node is not null.

- if k == node.leftNum + 1, return node
- if k > node.leftNum + 1, make k -= node.leftNum + 1, and then node = node.right
- otherwise, node = node.left