c++ ptree判断是否存在节点_LeetCode基础算法题第77篇:判断BST中是否存在两节点的和等于数K...

8e90b0a92bda6017f01e61c627e40e0e.png

一直很纠结算法的文章应该怎么写。最后觉得还是从最简单的level开始写吧,一开始就弄些重量级的,什么人工智能,机器学习的算法,还要有大量的数学以及优化的知识,小白们估计会很郁闷,当然我也不一定能做出来对吧。

我计划每题给出两种语言的解决方案,一种静态语言,一种动态语言。

我选择C语言,Python和Java作为实现语言,由于篇幅有限,其他语言的实现有兴趣的朋友请自己尝试。

LeetCode 653. 两数之和 IV - 输入 BST(Two Sum IV - Input is a BST)

问题描述:

给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。

示例:

3fd12154c9cb6153e01a71e331573e50.png

C语言实现:

两个节点的值的和要等于target,即两个节点都要在BST中。那么我们就可以得出这样的解题思路:当遍历到某个节点n的时候,检查BST中是否有节点的值满足target-n.val,如果存在,返回true,否则返回false。

C实现的代码如下:

5fb80f7d8bc4f1e8ae8923e15002b0ad.png

代码18行,调用函数isContain来检查整个BST是否存在值是k – cur->val的的节点。isContain实现的是BST搜索函数,如果找到返回true,否则返回false。在isContain函数中要避免找到的节点是当前节点自身,这就是isContain的第二个参数的用途。举个例子,

如果BST是[1,3],target是2,那么应该返回false的,如果isContain不检查cur的话,会返回true,这是错误的。

代码19行,对左右子树递归查找。

时间复杂度。_findTarget函数的递归的时间复杂度是O(n),且每次都会调用isContain函数,而isContain函数的时间复杂度是O(logn),所以总的时间复杂度是O(nlogn)。

f331be5bb21478e544c54be0854b4ead.png

python语言的实现:

相对于C语言的实现,python的实现我们对查找做了一些优化,不用每次都查找整个BST,我们可以在类中定义一个set变量s,当我们遍历到一个节点n的时候,如果我们发现s中不存在k-n.val的时候,我们就将n.val添加到s中,否则返回true。

这样查找的时间复杂度将降到O(1)。使得总的时间复杂度可以在O(n)内完成。

代码如下:

adf89afe3f37626fdaa6caa615859c41.png
cd19a6532a1d4637c5f3ae5d886ad4a0.png

Java语言的实现:

Java的实现和python语言的实现基本相同。

代码如下:

be3bc3604e8ac28384b925ba07dceb55.png
fa3fd3d7a4c4ddae75e7163ea06f6608.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值