[LeetCode]Kth Smallest Element in a BST BST中第k大元素

Kth Smallest Element in a BST

题意:求在BST中第k个最小的元素

DFS

思路:直接得出有序数组,然后根据下标求值,这应该是最直接能够想到的思路。

class Solution(object):
    def kthSmallest(self, root, k):
        """
        :type root: TreeNode
        :type k: int
        :rtype: int
        """
        def dfs(node):
            if not node:
                return
            dfs(node.left)
            nums.append(node.val)
            dfs(node.right)
        nums = []
        dfs(root)
        return nums[k-1]

因为上面的递归把所有的结果都计算出来了,但是其实我们只需要得到前面k个值而已,所以优化后变成。

class Solution(object):
    def kthSmallest(self, root, k):
        """
        :type root: TreeNode
        :type k: int
        :rtype: int
        """
        self.count = 0
        def dfs(node):
            if not node:
                return
            if self.count == k:
                return
            dfs(node.left)
            if self.count < k:
                nums.append(node.val)
                self.count += 1
            dfs(node.right)
        nums = []
        dfs(root)
        return nums[k-1]

二分查找

可以利用二分查找的思想,计算当前结点的左结点个数,如果k小于该个数,那么说明k必然在左边,则往当前结点的左结点递归,相反则说明在右边,则往当前结点的右结点递归。

class Solution(object):
    def kthSmallest(self, root, k):
        """
        :type root: TreeNode
        :type k: int
        :rtype: int
        """
        def getsize(node):
            if not node:
                return 0
            return 1 + getsize(node.left) + getsize(node.right)
        if not root:
            return 0
        left_size = getsize(root.left)
        if k == left_size + 1:
            return root.val
        elif left_size >= k:
            return self.kthSmallest(root.left, k)
        else:
            return self.kthSmallest(root.right, k-left_size-1)
posted @ 2017-09-15 13:49  banananana  阅读(271)  评论(0编辑  收藏  举报