二叉搜索树的第k个最小元素,第k个最大元素

二叉搜索树的中序遍历(左中右)为升序序列,递归或迭代实现中序遍历,进而找到第k个最小的元素

二叉搜索树的第k个最小元素
#递归
class Solution:
    def kthSmallest(self, root, k):
        def inorder(root):#中序遍历 左中右
            return inorder(root.left) + [root.val] + inorder(root.right) if root else []
        return inorder(root)[k-1]
时间复杂度:O(N),遍历了整个树
空间复杂度:O(N),用了一个数组存储中序序列
#迭代
class Solution:
    def kthSmallest(self, root, k):
        stack=[]
        while True:
            while root:
                stack.append(root)
                root = root.left
            root = stack.pop()
            k -=1
            if not k:
                return root.val
            root = root.right
时间复杂度:O(H+k),其中H指的是树的高度,由于我们开始遍历之前,要先向下达到叶,当树是一个平衡树时:复杂度为O(logN+k),当树是一个不平衡树时:复杂度为O(N+k),此时所有的节点都在左子树
空间复杂度:O(H+k),当树是一个平衡树时:O(logN+k)。当树是一个非平衡树时:O(N+k)

二叉搜索树的第k个最大元素,与第k个最小元素一样的思路,将中序遍历的左中右—>右中左,就是一降序序列

class Solution:
    def kthLargest(self, root: TreeNode, k: int) -> int:
        stack = []
        while True:
            while root:
                stack.append(root)
                root = root.right
            root = stack.pop()
            k -=1
            if not k:
                return root.val
            root = root.left
    def inorder(root):
        return inorder(root.left) + [root.val] + inorder(root.right) if root else []
    return inorder(root)[::-1][k-1]

你可能感兴趣的:(数据结构-二叉搜索树)