1305. All Elements in Two Binary Search Trees

package LeetCode_1305

/**
 * 1305. All Elements in Two Binary Search Trees
 * https://leetcode.com/problems/all-elements-in-two-binary-search-trees/
Given two binary search trees root1 and root2.
Return a list containing all the integers from both trees sorted in ascending order.

Example 1:
Input: root1 = [2,1,4], root2 = [1,0,3]
Output: [0,1,1,2,3,4]

Example 2:
Input: root1 = [0,-10,10], root2 = [5,1,7,0,2]
Output: [-10,0,0,1,2,5,7,10]

Example 3:
Input: root1 = [], root2 = [5,1,7,0,2]
Output: [0,1,2,5,7]

Example 4:
Input: root1 = [0,-10,10], root2 = []
Output: [-10,0,10]

Example 5:
Input: root1 = [1,null,8], root2 = [8,1]
Output: [1,1,8,8]

Constraints:
1. Each tree has at most 5000 nodes.
2. Each node's value is between [-10^5, 10^5].
 * */

class TreeNode(var `val`: Int) {
    var left: TreeNode? = null
    var right: TreeNode? = null
}

class Solution {
    /*
    * Solution: inOrder traverse and Merge sort; Time:O(m+n), Space:O(n)
    * */
    fun getAllElements(root1: TreeNode?, root2: TreeNode?): List<Int> {
        val list1 = ArrayList<Int>()
        val list2 = ArrayList<Int>()
        val result = ArrayList<Int>()
        inOrder(root1, list1)
        inOrder(root2, list2)
        var i = 0
        var j = 0
        val m = list1.size
        val n = list2.size
        while (i < m && j < n) {
            if (list1[i] < list2[j]) {
                result.add(list1[i++])
            } else {
                result.add(list2[j++])
            }
        }
        //check remaining
        while (i < m) {
            result.add(list1[i++])
        }
        while (j < n) {
            result.add(list2[j++])
        }
        return result
    }

    private fun inOrder(root: TreeNode?, list: ArrayList<Int>?) {
        if (root == null) {
            return
        }
        inOrder(root.left, list)
        list?.add(root.`val`)
        inOrder(root.right, list)
    }
}

 

posted @ 2021-08-17 15:12  johnny_zhao  阅读(16)  评论(0编辑  收藏  举报