题目
给定一棵二叉搜索树,请找出其中第 k 大的节点的值。
示例 1:
输入: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
输出: 4
示例 2:
输入: root = [5,3,6,2,4,null,null,1], k = 3
5
/ \
3 6
/ \
2 4
/
1
输出: 4
限制:
1 ≤ k ≤ 二叉搜索树元素个数
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法一:辅助空间
题目给到的是二叉搜索树。二叉搜索树有两个重要性质:
左子树<根节点<右子树。
中序遍历得到升序排列
因此第一种方法思路呼之欲出:
中序遍历这棵树,并逐步加入一个新数组中
第k大的数字下标即为数组长度-k
AC代码
时空复杂度
时间复杂度:O(N)
空间复杂度:O(N)
方法二:右中左遍历
可以看到方法一的空间复杂度为O(N),有没有一种方法能够在不借助辅助空间的前提下,找到第k大的元素值呢?
让我们看一下中序遍历的过程:左子树,根节点,右子树。这样得到的是升序排列。那么我们反过来,先右子树,根节点,再左子树。得到的是不是就是降序排列了呢?这样第k个访问到的是不是就是题目要求的?当然是。
AC代码
时空复杂度
时间复杂度:O(K)
空间复杂度:O(1)