LeetCode 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] 之間。

解法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 - 輸入有序數組

leetcode 15. 三數之和

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章