当我们遇到这类二叉树问题的时候,一般都有一个通用的解题思路
1、思考这道题用什么方式去遍历二叉树
2、遍历到二叉树的每个节点时要做什么操作
3、递归的退出条件
那我们就按照这样的思路来看看这道题
(1)首先,这道题要找到倒数第k大的结点,我们能确认需要用一种有排列顺序的遍历方式,那么这是一个二叉搜索树,所以我们首先会想到中序遍历的方式。
但是我们就遇到了一个问题,中序遍历二叉搜索树的结果是从大到小的,而我们要找到倒数第k大的值。只需要变通一下,将中序遍历的顺序反过来,先遍历大的值就可以了。
代码如下图所示:
(2)当我们遍历到每个结点时要做什么,我们选择从大到小的顺序去遍历二叉树,在寻找倒数第k大的值的时候,我们每遍历一个结点就将k的值-1,这样当k==0的时候,当前的结点就是倒数第k大的值。
代码如下:
(3)递归的退出条件:递归遍历时,当左右子树为空时,我们返回0,作为递归的退出条件,
但是,这道题有一个最大的问题,就是递归返回值的要怎么样才能接住,我们一定不能使用传统的定义变量接住返回值的方法(代码如下)。
当我们这样写的时候,根本不能解决问题,原因是无法确定我们最终的答案是从哪个递归返回来的,无法反馈给主函数最终的结果。
所以,需要在函数外面定义一个变量res去记录结点,作为最终的返回值返回到主函数中。
本题完整代码如下: