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)
}
}