给定一棵二叉搜索树,请找出其中第 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
/**
* Definition for a binary tree node.
* public class TreeNode {
* public int val;
* public TreeNode left;
* public TreeNode right;
* public TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public int KthLargest(TreeNode root, int k) {
//一般来讲,中序遍历的访问顺序是 左儿子-根节点-右儿子。对于二叉搜索树,体现出来的节点访问顺序是 从小到大
//只要将访问顺序改为 右儿子-根节点-左儿子,那么访问顺序就是从大到小,访问的第k个节点就是第k大的节点
//我们采用非递归算法,可以在找到第k大节点是直接返回。剩下的节点已经没有访问的必要了
//时间复杂度O(n),空间复杂度O(h),h为树的高度
var stk = new Stack<TreeNode>();
int idx=0;
while(stk.Count>0||root!=null)
{
while(root!=null)
{
stk.Push(root);//在 Stack 的顶部插入一个对象。
root=root.right;
}
root = stk.Pop();//删除并返回 Stack 顶部的对象。
if(++idx==k) return root.val;
root=root.left;
}
return 0;
}
}
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。