大家好,我是挨打的阿木木,爱好算法的前端摸鱼老。最近会频繁给大家分享我刷算法题过程中的思路和心得。如果你也是想提高逼格的摸鱼老,欢迎关注我,一起学习。
题目
1305. 两棵二叉搜索树中的所有元素
给你 root1 和 root2 这两棵二叉搜索树。
请你返回一个列表,其中包含 两棵树 中的所有整数并按 升序 排序。.
示例 1:
输入: root1 = [2,1,4], root2 = [1,0,3]
输出: [0,1,1,2,3,4]
示例 2:
输入: root1 = [0,-10,10], root2 = [5,1,7,0,2]
输出: [-10,0,0,1,2,5,7,10]
示例 3:
输入: root1 = [], root2 = [5,1,7,0,2]
输出: [0,1,2,5,7]
示例 4:
输入: root1 = [0,-10,10], root2 = []
输出: [-10,0,10]
示例 5:
输入: root1 = [1,null,8], root2 = [8,1]
输出: [1,1,8,8]
提示:
- 每棵树最多有
5000个节点。 - 每个节点的值在
[-10^5, 10^5]之间。
思路
这道题目首先得明白二叉搜索树的概念,二叉搜索树是中序遍历单调递增的一颗树,如果还不知道什么是中序遍历可以看我之前的这篇文章:一文彻底搞懂二叉树的前序、中序、后序遍历。
- 首先通过迭代的方式来遍历两颗二叉搜索树,用两个栈来存储节点;
- 分别找到两颗树的中序遍历中的第一个节点;
- 然后依次比较两个栈中的末尾元素,把最小值
push进结果数组中去; - 一直循环到遍历完了一颗树后,把剩余树单独遍历完即可。
实现
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root1
* @param {TreeNode} root2
* @return {number[]}
*/
var getAllElements = function(root1, root2) {
let stack1 = root1 ? [ root1 ] : [],
stack2 = root2 ? [ root2 ] : [];
let result = [];
// 如果两个栈都不为空,比较栈中最后一个元素的大小,把最小值放到结果数组中去
while (stack1.length && stack2.length) {
let last1 = stack1[stack1.length - 1],
last2 = stack2[stack2.length - 1];
// 找到最左子节点
while (last1.left) {
stack1.push(last1.left);
last1.left = null;
last1 = stack1[stack1.length - 1];
}
// 找到最右子节点
while (last2.left) {
stack2.push(last2.left);
last2.left = null;
last2 = stack2[stack2.length - 1];
}
// 两者间的最小值出栈
if (last1.val <= last2.val) {
result.push(last1.val);
stack1.pop();
last1.right && stack1.push(last1.right);
} else {
result.push(last2.val);
stack2.pop();
last2.right && stack2.push(last2.right);
}
}
getStackNode(stack1, result);
getStackNode(stack2, result);
return result;
};
// 朴实无华的中序遍历
function getStackNode(stack, result) {
while (stack.length) {
let last = stack[stack.length - 1];
if (last.left) {
stack.push(last.left);
last.left = null;
} else {
result.push(last.val);
stack.pop();
last.right && stack.push(last.right);
}
}
}
结果
看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。