题解 | #二叉搜索树的第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);
        }
    }


}
全部评论

相关推荐

专心打鱼:互联网搬运工,贴子都要偷
点赞 评论 收藏
分享
2 收藏 评论
分享
牛客网
牛客企业服务