求:
给定一棵二叉搜索树,请找出其中第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 ≤ 二叉搜索树元素个数
解:
思路:首先观察到题设条件,1 ≤ k ≤ 二叉搜索树元素个数,这意味着一定可以找到对应的节点,不会出现要找的节点不在树中的情况,也就不需要对这种情况进行特殊处理。同时,根据二叉搜索树的特点,我们进行反序中序遍历时(先遍历右子树,再遍历根节点,最后遍历左子树),得到的节点值是单调递减的。因此当我们执行了k次遍历操作后,找到的节点就是第k大的节点,将该节点的值记录下来,并在主调函数中返回即可。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
void
Traverse(
struct
TreeNode* root,
int
* curr,
int
*ret){
if
(root==NULL)
return
;
Traverse(root->right,curr,ret);
if
(--*curr ==
0
){
*ret = root->val;
return
;
}
Traverse(root->left,curr,ret);
}
int
kthLargest(
struct
TreeNode* root,
int
k){
if
(root==NULL)
return
0
;
int
ret;
Traverse(root,&k,&ret);
return
ret;
}
来源:oschina
链接:https://my.oschina.net/u/4469818/blog/4286673