题解 | #二叉搜索树的第k个结点#
二叉搜索树的第k个结点
http://www.nowcoder.com/practice/ef068f602dde4d28aab2b210e859150a
/* 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); } } }