剑指 Offer II 056. 二叉搜索树中两个节点之和

一、题目

剑指 Offer II 056. 二叉搜索树中两个节点之和
同Leetcode 653. 两数之和 IV - 输入 BST

给定一个二叉搜索树的 根节点 root 和一个整数 k , 请判断该二叉搜索树中是否存在两个节点它们的值之和等于 k 。假设二叉搜索树中节点的值均唯一。

示例 1:
输入: root = [8,6,10,5,7,9,11], k = 12
输出: true
解释: 节点 5 和节点 7 之和等于 12

🐖 root 为二叉搜索树(即二叉排序树)

二、解题思路

二叉搜索树的中序遍历结果是递增的数列.
所以中序遍历完了以后就是头尾指针对撞找值即可.
方法:中序遍历+双指针

三、代码
class Solution:
    def findTarget(self, root: TreeNode, k:
int) -> bool:
        # 两数之和换皮版本,二叉搜索树为了得到排序数组,且同一个位置的数不能使用两次
        inorderlst = [] # 收集升序数组
        def in_order(node): # 中序遍历收集升序数组
            if node == None:
                return 
            in_order(node.left)
            inorderlst.append(node.val)
            in_order(node.right)
        in_order(root)
        # 双指针
        left= 0 
        right = len(inorderlst) - 1
        while left < right: # 两个不能相等
            if inorderlst[left] + inorderlst[right] == k:
                return True
            elif inorderlst[left] + inorderlst[right] < k: # 总和偏小,小指针右移
                left += 1
            elif inorderlst[left] + inorderlst[right] > k: # 总和偏大,大指针左移
                right -= 1
        return False # 没有找到结果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值