標籤:排序,二叉搜索樹
給你 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] 之間。
解法1:
class Solution {
List<Integer> ans = new ArrayList<>();
public List<Integer> getAllElements(TreeNode root1, TreeNode root2) {
preTreeNode(root1);
preTreeNode(root2);
ans.sort((Comparator.comparingInt(a -> a)));
return ans;
}
// 前序遍歷TreeNode,把結果存入ans(ArrayList類型)中
private void preTreeNode(TreeNode root) {
if (root == null) {
return;
}
ans.add(root.val);
if (root.left != null) {
preTreeNode(root.left);
}
if (root.right != null) {
preTreeNode(root.right);
}
}
}
想到的最簡單的方法是,對兩棵樹進行任意形式的遍歷,上面的例子給出的是前序遍歷。並將遍歷到的所有元素放入一個List中,最後對這個數組進行排序即可。執行的結果如下:
複雜度分析:
-
時間複雜度:O((M+N)log(M+N)),其中 M 和 N 是兩棵樹中的節點個數。
-
空間複雜度:O(M + N),其中 M 和 N 是兩棵樹中的節點個數。
執行的效果只能說一般。因爲這種方法沒有利用到二叉搜索樹本身的性質。如果我們對二叉搜索樹進行中序遍歷,就可以直接得到樹中所有元素升序排序後的結果,減少後面的排序算法的調換位置等操作。因此我們可以對兩棵樹分別進行中序遍歷,它們分別存到ans結果列表中,然後進行排序,就可以得到最終的結果。
解法二:
class Solution {
List<Integer> ans = new ArrayList<>();
public List<Integer> getAllElements(TreeNode root1, TreeNode root2) {
midTreeNode(root1);
midTreeNode(root2);
ans.sort((Comparator.comparingInt(a -> a)));
return ans;
}
// 中序遍歷TreeNode,把結果存入ans(ArrayList類型)中
private void midTreeNode(TreeNode root) {
if (root == null) {
return;
}
if (root.left != null) {
midTreeNode(root.left);
}
ans.add(root.val);
if (root.right != null) {
midTreeNode(root.right);
}
}
}
這裏沒做上面大的改動,只是把前序遍歷改成中序遍歷。執行結果如下:
執行結果如上。效果還不錯。最後查看了一下跑13ms代碼,解法和我第二種思路是一樣的。可能是之前測試用例數據較少所以有些時間的差別。這個和官方的題解思路也是一樣的。
往期內容
leetcode 167. 兩數之和 II - 輸入有序數組