题目地址:

https://leetcode.com/problems/two-sum-bsts/

给定两棵二叉搜索树,再给定一个数xxx,问两棵BST里是否各自存在一个节点使得它们之和恰好等于xxx。

在两个序列上做这件事是容易的,可以直接用对撞双指针(一个指针指向第一个数组的开头,另一个指向第二个数组的结尾)。现在要在两棵BST上做,思路是一样的,可以先实现二叉树的中序遍历的迭代器,以及逆序中序遍历的迭代器,然后就可以当成数组的情况来做了。

中序遍历迭代器的写法是用栈,初始化的时候,先将树根所在的左链push进栈,每次弹出的节点即为下一个走到的节点,走到之后,将其左儿子所在的左链push进栈(如果有的话)。逆序中序遍历迭代器的写法和正序中序遍历迭代器的写法是对称的。

代码如下:

class Solution {public:struct Ite {stack<TreeNode *> stk;bool desc;Ite(TreeNode *root, bool desc) : desc(desc) {while (root) {stk.push(root);root = !desc ? root->left : root->right;}}// 重载bool()运算符operator bool() { return stk.size(); }// 重载dereference运算符int operator*() { return stk.top()->val; }// 重载前置++运算符Ite &operator++() {auto t = stk.top(); stk.pop();if (!desc) {auto right = t->right;while (right) {stk.push(right);right = right->left;}} else {auto left = t->left;while (left) {stk.push(left);left = left->right;}}return *this;}};bool twoSumBSTs(TreeNode *r1, TreeNode *r2, int t) {Ite it1(r1, false), it2(r2, true);while (it1 && it2) {int x1 = *it1, x2 = *it2;if (x1 + x2 < t) ++it1;else if (x1 + x2 > t) ++it2;else return true;}return false;}
};

时间复杂度O(n1+n2)O(n_1+n_2)O(n1​+n2​),空间O(h1+h2)O(h_1+h_2)O(h1​+h2​)。

【Leetcode】1214. Two Sum BSTs相关推荐

  1. 【LeetCode】1. Two Sum

    传送门:https://leetcode.com/problems/two-sum/#/description 一.题目描述 Given an array of integers, return in ...

  2. 【leetcode】Minimum Path Sum

    Minimum Path Sum Given a m x n grid filled with non-negative numbers, find a path from top left to b ...

  3. 【LeetCode】#39组合总和(Combination Sum)

    [LeetCode]#39组合总和(Combination Sum) 加粗样式 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数 ...

  4. 【LeetCode】【HOT 100】2. 两数相加

    [LeetCode][HOT 100]2. 两数相加 文章目录 [LeetCode][HOT 100]2. 两数相加 package hot;import java.util.Arrays;class ...

  5. 【LeetCode】剑指 Offer 34. 二叉树中和为某一值的路径

    [LeetCode]剑指 Offer 34. 二叉树中和为某一值的路径 文章目录 [LeetCode]剑指 Offer 34. 二叉树中和为某一值的路径 package offer;import ja ...

  6. 【LeetCode】剑指 Offer 13. 机器人的运动范围

    [LeetCode]剑指 Offer 13. 机器人的运动范围 文章目录 [LeetCode]剑指 Offer 13. 机器人的运动范围 package offer;public class Solu ...

  7. 【LeetCode】第643题——子数组最大平均数I(难度:简单)

    [LeetCode]第643题--子数组最大平均数I(难度:简单) 题目描述 解题思路 代码详解 注意点 题目描述 给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数. 示 ...

  8. 【leetcode】771. 宝石与石头 (简单)

    [leetcode]771. 宝石与石头 给你一个字符串 jewels 代表石头中宝石的类型,另有一个字符串 stones 代表你拥有的石头. stones 中每个字符代表了一种你拥有的石头的类型,你 ...

  9. 【LeetCode】1641. Count Sorted Vowel Strings(动态规划)

    [LeetCode]1641. Count Sorted Vowel Strings(动态规划) Given an integer n, return the number of strings of ...

  10. 【leetcode】二维子矩阵的和

    一. 题目描述给定一个二维矩阵 matrix,以下类型的多个请求: 计算其子矩形范围内元素的总和,该子矩阵的左上角为 : (row1, col1) ,右下角为 (row2, col2) . 实现 Nu ...

最新文章

  1. 剑指offer_第1题_二维数组中的查找
  2. python自学网站有哪些-分享干货:三个新手自学Python的网站!
  3. 【转】从3个科技公司里学到的57条经验
  4. SAP License管理
  5. Oracle分页查询语句
  6. SpringBoot高级-消息-RabbitTemplate发送接受消息序列化机制
  7. 编程实现木马的ActiveX启动和注入IE的启动方式
  8. 智慧社区防控(测温)
  9. github emoji 表情列表 1
  10. 《PaaS程序设计》一1.2 云能为创新做什么
  11. faster rcnn resnet_张航、李沐等人提出ResNet最强改进版:性能提高3%,参数不增
  12. 推荐一款ORM工具 FOR ADOBE AIR
  13. 零跑科技实现“领跑”背后:频现“质量门”,噱头大于实际?
  14. 2019年全国各类型POI数据
  15. 软考-架构师-第六章-开发方法 第二节 软件开发模型(读书笔记)
  16. python马尔可夫链_Python中的马尔可夫链(初学者)
  17. 针对文档加密系统,如何不破解将文档解密上传
  18. imx6ull用video4linux,CB140(imx6ull)使用Openwrt系统
  19. c盘扩容(亲测有效)+软件已备好
  20. WeQuant交易策略—5日均线

热门文章

  1. ansible中变量注册 register的使用
  2. 如何删除双系统中的一个系统
  3. JavaScript实现12进制的时钟特效
  4. 计算机读不出光盘,光驱读不出光盘,小编教你电脑光盘不能被识别怎么解决
  5. 蓝桥ROS机器人之v-rep_pro_edu_v3_6_2
  6. 一文说透区块链为何必须扩容,扩容的未来在哪里?
  7. python取出字典重复值_在Python中的字典中查找具有重复值的键
  8. Python基础+数据科学入门(四)程序控制结构
  9. 可调稳压电源lm317实验报告_LM317可调稳压电源电路图
  10. python一键安装所有插件_解放你的双手,让你一键安装所有的KODI插件的懒人包来了...