力扣剑指offer54.二叉搜索树的第k大的节点

 当我们遇到这类二叉树问题的时候,一般都有一个通用的解题思路

1、思考这道题用什么方式去遍历二叉树

2、遍历到二叉树的每个节点时要做什么操作

3、递归的退出条件

                                        那我们就按照这样的思路来看看这道题

(1)首先,这道题要找到倒数第k大的结点,我们能确认需要用一种有排列顺序的遍历方式,那么这是一个二叉搜索树,所以我们首先会想到中序遍历的方式。

但是我们就遇到了一个问题,中序遍历二叉搜索树的结果是从大到小的,而我们要找到倒数第k大的值。只需要变通一下,将中序遍历的顺序反过来,先遍历大的值就可以了。

代码如下图所示:

 (2)当我们遍历到每个结点时要做什么,我们选择从大到小的顺序去遍历二叉树,在寻找倒数第k大的值的时候,我们每遍历一个结点就将k的值-1,这样当k==0的时候,当前的结点就是倒数第k大的值。

代码如下:

 

 (3)递归的退出条件:递归遍历时,当左右子树为空时,我们返回0,作为递归的退出条件,

但是,这道题有一个最大的问题,就是递归返回值的要怎么样才能接住,我们一定不能使用传统的定义变量接住返回值的方法(代码如下)。

 当我们这样写的时候,根本不能解决问题,原因是无法确定我们最终的答案是从哪个递归返回来的,无法反馈给主函数最终的结果。

所以,需要在函数外面定义一个变量res去记录结点,作为最终的返回值返回到主函数中。

本题完整代码如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿瑞不会C++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值