/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
要充分利用二叉搜索树+中序遍历顺序 = 从小到大排序这么一个特点。
这里的遍历操作就是把count值加1再去和k比,为什么要加1呢?因为count模拟的是数组的下标,下标加1在会等于“第几个”。比如2+1=第3小的数。而K表示的就是第几小的数。
在理解中序遍历的时候,一定要自己手画几个栈多去模拟一下过程,这样才能理解为什么count<k要去递归它的右子树(递归可以理解为一种压栈的过程),return可以理解为什么都不做直接弹栈。而正常弹栈是有操作的,就是count加1并且和K进行比较,最终目的是找到和K一样的count+1.并且把root返回。所以我们也可以知道,虽然压栈的左右子树,**但是我们需要左右子树为空才开始正常弹栈,那么遍历的一定是根节点**。
public class Solution {
int count = 0;//维护一个索引
TreeNode result = null;//初始化一个结果节点
TreeNode KthNode(TreeNode pRoot, int k) {
inOrder(pRoot,k);
return result;
}
void inOrder(TreeNode root,int k){
if(root == null)return;
inOrder(root.left,k);
count++;//下标值需要加1,这个时候可以假设已经排好序了
if(count == k)result = root;
else if(count > k)return;
else{
inOrder(root.right,k);
}
}
}