剑指offer10 JZ54 二叉搜索树的第k个节点
二叉搜索树的第k个节点
https://www.nowcoder.com/practice/57aa0bab91884a10b5136ca2c087f8ff?tpId=13&tqId=2305268&ru=%2Fpractice%2F91b69814117f4e8097390d107d2efbe0&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D1%26tpId%3D13%26type%3D13
思路
根据二叉搜索树的性质,左子树的元素都小于根节点,右子树的元素都大于根节点。因此它的中序遍历(左中右)序列正好是由小到大的次序,因此我们可以尝试递归中序遍历,也就是从最小的一个节点开始,找到k个就是我们要找的目标。
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param proot TreeNode类
* @param k int整型
* @return int整型
*/
//利用二叉树的性质 左子树比根节点小 右子树比根节点大
//记录下访问的次数 就能找出第k小的值
TreeNode res=null;
int count=0;//记录中序遍历的访问个数
public int KthNode (TreeNode proot, int k) {
// write code here
midOrder(proot,k);
if(res==null){
return -1;
}
else{
return res.val;
}
}
public void midOrder(TreeNode root,int k){
if(root==null || count>k){
return; //终止遍历
}
midOrder(root.left,k);// 左子树
count++; //记录访问节点次数
if(count==k){
res=root; //记录下
}
midOrder(root.right,k);
}
}