[路飞][LeetCode]1305_两棵二叉搜索树中的所有元素

138 阅读1分钟

「这是我参与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
};

如有任何问题或建议,欢迎留言讨论!