
解法:中序遍历
首先,明确二叉搜索树的性质:
(1)若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)它的左、右子树也是二叉搜索树。
(4)它的中序遍历结果是一个递增序列。
在本题中,如果使用中序遍历的倒序,即右->根->左,会得到我们想要的递减序列。
找到第kkk大后,提前终止递归。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
// 中序遍历的倒序:右->根->左,输出是递减序列
void dfs(struct TreeNode* root, int *k, int *ret)
{
// 递归终止条件
if(!root || !(*k)) return;
// 遍历右子树
dfs(root->right, k, ret);
// 访问根节点
(*k)--;
if(*k == 0) *ret = root->val;
// 遍历左子树
dfs(root->left, k, ret);
}
int kthLargest(struct TreeNode* root, int k){
int ret;
dfs(root, &k, &ret);
return ret;
}
本文介绍如何利用中序遍历的倒序策略,即右->根->左,从二叉搜索树中找到第k大的节点。通过递归实现并提前终止,提供了一个用于查找kth最大值的函数。
234

被折叠的 条评论
为什么被折叠?



