剑指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小结点
}
}