解题思路:
需要查找二叉搜索树中第k个最小元素,因此我们需要遍历出二叉搜索树中最小的节点,并当遍历到第k个最小的节点时,返回该节点的值,而刚好二叉树的中序遍历是先访问左子树再访问右子树再访问父节点,刚好满足从小到大的顺序。这里我们用递归的方式来进行遍历
递归终止条件
这里一般的遍历递归的条件是当节点为空时,return null,而为了减少遍历次数节约时间,当我们遍历到第k个元素的时候,我们就不需要再遍历了。
在这里用result来作为接收第k小的元素,初始化时将他定义为null,当他被传值之后,如果(result !== null) 也要return null,因此递归终止条件就是:
if(!root || reuslt !=== null) return ;
递归单步操作
先定义递归函数 function inOrderTraversal(root){}
与中序遍历一样,首先遍历左子树,遍历一次num数量加1,当遍历次数达到k次后,把节点的值传递给result,并return结束这次递归,再进行遍历右子树,这里与中序遍历的顺序一致,只不过这里不是将值push到数组保存起来,而是检查遍历的次数
inOrderTraversal(root.left)
nums++
if(nums === k){
result = root.val
return
}
inOrderTraversal(root.right)
调用递归方法并返回result值
inOrderTraversal(root);
return result
总结
方法就是中序遍历,注意递归终止条件提高执行效率