「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」
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]之间。
中序遍历
思路
根绝题意我们知道题目中的树是两颗二叉搜索树,如果中序遍历自然是升序排列,所以我们直接用中序遍历方式,得到两个有序的数组。
接着只需要合并两个有序数组即可得到结果
实现步骤
- 声明Traversal函数用来中序遍历两个链表,将每个节点放入结果stack栈数组中,若该节点有子节点,按照右->中->前的顺序继续放入stack中(因为我们会通过pop来遍历stack栈,这样刚好是前->中->右),并将该节点的左右子节点置为空,最后会将所有的节点都放入stack中,如果某个节点没有左右子节点则直接将其值放入res中,最后遍历完毕stack可得到排序好的数组res
- 合并两个有序数组
- 比较两数组中的首位,若小,则shift拿出节点放入result中,结束条件是,Traversal1和Traversal2的len都不为0
- 最后将Traversal1和Traversal2中的剩余元素合并到result 最后返回合并后的结果result即可
var getAllElements = function (root1, root2) {
var Traversal = function (root) {
if (!root) return []
var stack = [root]
var res = []
while (stack.length > 0) {
var node = stack.pop()
if (!node.left && !node.right) {
res.push(node.val)
continue
}
var left = node.left
var right = node.right
node.left = node.right = null
if (right) {
stack.push(right)
}
stack.push(node)
if (left) {
stack.push(left)
}
}
return res
};
var Traversal1 = Traversal(root1)
var Traversal2 = Traversal(root2)
var result = []
while(Traversal1.length&&Traversal2.length){
if(Traversal1[0]<Traversal2[0]){
result.push(Traversal1.shift())
}else{
result.push(Traversal2.shift())
}
}
if(Traversal1.length) result = result.concat(Traversal1)
if(Traversal2.length) result = result.concat(Traversal2)
return result
}