剑指Offer62:二叉搜索树的第k个结点(Java)

参考“Echos”的牛客解答:https://www.nowcoder.com/questionTerminal/ef068f602dde4d28aab2b210e859150a?f=discussion

思路分析:

首先了解搜索二叉树在中序遍历下的结果是有序的。设一个全局变量num记录次数,每当中序遍历到一个节点时,num++。当num等于k时,返回node即结果。
难在递归上

题目描述

给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。

参考答主Echos的代码:

public class Solution {
    int num=1;
    TreeNode KthNode(TreeNode pRoot, int k)
    {    
        if(pRoot==null||k<1){
            return null;
        }else{
            TreeNode left=KthNode(pRoot.left,k);
            if(left!=null){//为什么会判断是否为null,是因为只有当num等于k时才会返回结点,其他情况只返回null,因为第k小只有一个。
                return left;
            }
            if(num==k){
                return pRoot;
            }
            num++;
            TreeNode right=KthNode(pRoot.right,k);
            if(right!=null){
                return right;
            }
        }
        return null;//num不等于k时,只返回null。 
    }
}

自己思路的代码:

我的代码效率不如上面的,只有全部遍历结束了才返回结果。

public class Solution {
    int num=1;
    TreeNode res=null;//用来保存唯一的结果
    TreeNode KthNode(TreeNode pRoot, int k)
    {    
        if(pRoot==null||k<1){
            return null;
        }
        TreeNode left=KthNode(pRoot.left,k);
        if(num==k){
            res= pRoot;
        }
        num++;
        TreeNode right=KthNode(pRoot.right,k);
        return res;//找到第k小之前,谁调用我都返回null,找到第k小之后,谁调用我都返回第k小结点
    }
}
posted @ 2020-02-21 17:41  31楼下小黑  阅读(160)  评论(0编辑  收藏  举报