题目
给定一棵二叉搜索树,请找出其中第 k 大的节点的值。
思路
比较简单,可以想到使用中序遍历,但是使用 右孩子->根节点->左孩子
的顺序遍历,即可得到二叉搜索树的有序递增序列,并且提前终止遍历。
实现方法好想到,但是卡在了需要用变量存储 k 和找到的节点 targetNode ,这两个变量在递归中,回溯的时候会被覆盖,得提前定义两个变量存储。
代码实现
class Solution {
TreeNode targetNode; //第k大的树节点
int kth; //暂存k的变量
public int kthLargest(TreeNode root, int k) {
kth = k; //赋值
middle(root);
return targetNode.val;
}
//中序遍历
private void middle(TreeNode root){
if(root == null || kth <= 0) return; //递归终止条件,节点为空或者k小于等于0
middle(root.right); //往根节点右孩子走
if(--kth == 0) { //若找到第k大的值
targetNode = root; //保存节点
return; //结束递归
}
middle(root.left); //往根节点左孩子走
}
}
总结
要注意递归所需要的参数,能不能跟着一起递归。