力扣算法ing(42/100)
3.29 230.二叉搜索树中第k小的元素
给定一个二叉搜索树的根节点 root
,和一个整数 k
,请你设计一个算法查找其中第 k
小的元素(从 1 开始计数)。
示例 1:
输入:root = [3,1,4,null,2], k = 1
输出:1
示例 2:
输入:root = [5,3,6,2,4,null,null,1], k = 3
输出:3
我的思考:
中序遍历:1 2 3 4
1 2 3 4 5 6
我们发现中序遍历是一个升序的数组
对二叉树进行中序遍历,我们中序遍历寻找第k个节点,k–,如果k=0,返回这个节点
我的代码:
function kthSmallest(root: TreeNode | null, k: number): number {
if(root === null) return null;
function helpFind(root: TreeNode | null, k: number): number {
if(root === null) return null;
helpFind(root.left , k);
k--;
if(k === 0) return root.val;
helpFind(root.right , k);
}
return helpFind(root , k);
};
答案错误:
返回值处理不当:在 helpFind 函数中,当你递归调用 helpFind(root.left, k) 时,你没有处理它的返回值。如果左子树中已经找到了第 k 小的值,那么你应该立即返回这个值,而不是继续递归右子树。
全局 k 的值未更新:在递归调用 helpFind(root.left, k) 后,即使左子树中找到了第 k 小的值,k 的值并没有被更新或传递回来,因此 k-- 可能会在错误的节点上执行。
利用res来存储值
这两段代码的主要区别就在于k,代码2中res 和 target 被用作控制递归流程的全局状态变量,代码1这样还是
有点危险,还是用全局变量存储吧
正确代码:
function helpFind(root: TreeNode | null) {
if(root === null) return;
helpFind(root.left);
target--;
if(target === 0){
res = root.val;
};
helpFind(root.right);
}
if(root === null) return null;
let res : number = 0;
let target = k;
helpFind(root)
return res;
恭喜恭喜!!终于看到二叉搜索树就使用中序遍历啦!虽然我觉得第一个答案是可以的,但是一直答案错误,ai说用全局变量比较好,okok,那就用试试吧,果然成功了(苦笑)。