题目要求
给定一棵二叉搜索树,请找出其中的第k小的结点。
解题思路
二叉搜索树的自身结构特点可以通过中序遍历后,得到一个非递减的有序序列,我们存储一下个序列并找到第k-1的位置即可。
实现代码
/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
function KthNode(pRoot, k)
{
// write code here
if(!pRoot){
return null;
}
let stack = []; // 用于存储遍历后的有序序列
function dfsReverse(node) {
if(node != null) {
dfsReverse(node.left);
stack.push(node.val);
dfsReverse(node.right);
}
}
dfsReverse(pRoot);
if(k>stack.length) {
return null;
}
return stack[k-1]
}
吐槽一下牛客的算法判定
这道题我首先在leetcode上刷过一遍了,和这里的题意大体一致,只不过需要反转一下,找的是最大的k个节点。
实现的结果如下图所示:
而类似的逻辑,我在牛客上稍加改动后,居然测试用例有一部分跑不通了,只有百分之35,这就很奇怪:
我为了验证到底是怎么回事,我就本地准备了牛客上出现问题的测试用例跑了一下,单步调试,结果如下图所示:
真的是相当奇怪,本地也是按照预期正确执行了。百思不得其解的我翻看了牛客网上其他通过了答案,结果发现,我给的代码第16行改为stack.push(node);
就可以了。真的是说不通,牛客网的判定需要改进啊。所以如果在牛客网上自己的算法测试用例不能全部跑通,未必是你的逻辑或者语法有问题,也有可能是牛客网背后的判定出了诡异的bug。