[路飞]_程序员必刷力扣题: 1305. 两棵二叉搜索树中的所有元素

164 阅读2分钟

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战

1305. 两棵二叉搜索树中的所有元素

给你 root1 和 root2 这两棵二叉搜索树。

请你返回一个列表,其中包含 两棵树 中的所有整数并按 升序 排序。.

 

示例 1:

image.png

输入: 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:

image.png

输入: 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
}