说明:
该题牛客和力扣有点区别,下面分别来进行解决。
题目描述
(1)力扣:
给定一棵二叉搜索树,请找出其中第k大的节点。
注意:这里是求第k大结点,而且题目给的返回值为int,是个数值。
思路分析:
求二插搜索树的第k大结点,则用右根左的方式遍历二叉树序列,结果为递减序列,找到其中的第k个元素即可。
参考代码:
class Solution {
private int res;//定义成员变量
private int k;//定义成员变量
public int kthLargest(TreeNode root, int k) {
if(root == null || k < 0)return -1;
this.k = k;//赋值
dfs(root);
return res;//这里返回的是第k大结点的 结点值
}
public void dfs(TreeNode root){
if(root == null)return;
if(k == 0) return;
//右
dfs(root.right);
//根
if(--k == 0)res = root.val;//别忘了--
//左
dfs(root.left);
}
}
(2)牛客:
题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
注意:这里是求第k小结点,而且题目给的返回值为TreeNode,是个结点。
思路分析:
求二插搜索树的第k小结点,则用左根右的方式遍历二叉树序列,结果为递增序列,找到其中的第k个元素即可。
参考代码:
class Solution {
private TreeNode res;//定义成员变量,注意这里成了结点类型
private int k;//定义成员变量
TreeNode KthNode(TreeNode root, int k){
if(root == null || k < 0)return null;
this.k = k;//赋值
dfs(root);
return res;//这里返回的是 第k小的结点
}
public void dfs(TreeNode root){
if(root == null)return;
if(k == 0) return;
//左
dfs(root.left);
//根
if(--k == 0)res = root;//别忘了--
//右
dfs(root.right);
}
}
(完)