开启我的LeetCode刷题日记:1305. 两棵二叉搜索树中的所有元素

58 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

编程世界总是离不了算法

最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力

于是决定蹭着假期,加强算法和数据结构相关的知识

那怎么提升呢?

其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅

第一阶段目标是:200道,每天12

为了不乱,本系列文章目录分为三部分:

  1. 今日题目:xxx
  2. 我的思路
  3. 代码实现

今日题目:1305. 两棵二叉搜索树中的所有元素

给你 root1 和 root2 这两棵二叉搜索树。请你返回一个列表,其中包含 两棵树 中的所有整数并按 升序 排序。.

 

示例 1:

输入:root1 = [2,1,4], root2 = [1,0,3] 输出:[0,1,1,2,3,4]

示例 2:

输入:root1 = [1,null,8], root2 = [8,1] 输出:[1,1,8,8]  

提示:

每棵树的节点数在 [0, 5000] 范围内 -105 <= Node.val <= 105

来源:力扣(LeetCode) 链接:leetcode.cn/problems/al… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我的思路

简单粗暴一点的思路就是:中序遍历两个 BST 得到两个有序数组,然后把这两个有序数组合并,但是空间复杂度会高一些

比较好的办法是用 《173. 二叉搜索树迭代器》的题解中序遍历:迭代的方式来寻找下一个 中实现的 BST 迭代器

然后进行合并两个有序列表

代码实现

/**
 * @param {TreeNode} root1
 * @param {TreeNode} root2
 * @return {number[]}
 */
var getAllElements = function (root1, root2) {
  function BSTIterator(root) {
    let stack = [];
    const toLeft = (root) => {
      while (root) {
        stack.push(root);
        root = root.left;
      }
    };
    toLeft(root);
    this.peek = () => {
      return stack[stack.length - 1].val;
    };
    this.next = () => {
      let cur = stack.pop();
      toLeft(cur.right);
      return cur.val;
    };
    this.hasNext = () => {
      return stack.length;
    };
  }
  let r1 = new BSTIterator(root1);
  let r2 = new BSTIterator(root2);
  let res = [];
  while (r1.hasNext() && r2.hasNext()) {
    if (r1.peek() > r2.peek()) {
      res.push(r2.next());
    } else {
      res.push(r1.next());
    }
  }
  // 如果有一棵 BST 还剩元素,添加到最后
  while (r1.hasNext()) res.push(r1.next());
  while (r2.hasNext()) res.push(r2.next());

  return res;
};


总结

实现方式其实有很多,这里仅供参考~

由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹