持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
编程世界总是离不了算法
最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力
于是决定蹭着假期,加强算法和数据结构相关的知识
那怎么提升呢?
其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode
刷题之旅
第一阶段目标是:200
道,每天1
到2
篇
为了不乱,本系列文章目录分为三部分:
- 今日题目:xxx
- 我的思路
- 代码实现
今日题目: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;
};
总结
实现方式其实有很多,这里仅供参考~
由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹