「这是我参与2022首次更文挑战的第31天,活动详情查看:2022首次更文挑战」
看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~
谁能九层台,不用累土起!
题目
给你 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]之间。
解题思路
- 我们首先需要对二叉搜索树有个简单的认识,二叉搜索树具有
left<root<right的贴点 - 我们使用中序遍历拿到所有的元素,放到数组中
- 对数组进行
sort排序 - 完成题解
解题代码
var getAllElements = function(root1, root2) {
const res = []
function dfs(root){ // 中序遍历
if(!root) return
root.left&&dfs(root.left);
res.push(root.val);
root.right&&dfs(root.right);
}
dfs(root1)
dfs(root2)
return res.sort((a,b)=> a-b) // 排升序
};
归并排序
其实思路与上面的差不多,都是用中序遍历的方式得到两棵树的有序数组,然后用归并排序合并两个有序数组。
var getAllElements = function(root1, root2) {
const res = []
const arr1 = []
const arr2 = []
function dfs(root,arr){ // 中序遍历
if(!root) return
root.left&&dfs(root.left,arr);
arr.push(root.val);
root.right&&dfs(root.right,arr);
}
dfs(root1,arr1)
dfs(root2,arr2)
let a = arr1.length
let b = arr2.length
let i = 0
let j = 0
while(i<a||j<b){
if(i>=a||(j<b&&arr1[i]>arr2[j])){
res.push(arr2[j++])
}else{
res.push(arr1[i++])
}
}
return res
};
如有任何问题或建议,欢迎留言讨论!