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

102 阅读1分钟

题目描述

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

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

解题思路

算法,数据结构

二叉树的中序遍历,归并排序

思路

因为需要升序排列,我会先将两个二叉树的所有元素通过中序遍历不断地 push 到一个数组中,因为中序遍历正好是生序,然后对于生成的两个数组

通过归并排序将他们放入合并的数组中

过程

全过程包含两部分,一个是遍历所有节点把 val 分别 push 到数组中,因此我们声名变量:

const arr1 = []
const arr2 = []
const ret = []

其中,
arr1root1 这棵树的所有节点值按照在中序遍历之后,按照升序排列的结果
arr2 则对应 root2 这棵树

这里需要递归来实现中序遍历

function inOrder(arr, root) {
  if (!root) return

  if (root.left) inOrder(arr, root.left)
  arr.push(root.val)
  if (root.right) inOrder(arr, root.right)
}

先向左递归,push 他的 val,然后是中间,最后是右边

在拿到两个区间后,用归并排序来进行合并

while (p1 < arr1.length || p2 < arr2.length) {
    if (p2 >= arr2.length || (p1 < arr1.length && arr1[p1] <= arr2[p2])) {
      ret.push(arr1[p1++])
    } else {
      ret.push(arr2[p2++])
    }
  }

首先声明两个变量 p1, p2,分别为左区间当前遍历到的 index 以及右区间的 index

在合并过程中,如果两区间有一个还没有遍历完,我们就要继续这个过程,因此 while 循环的种植条件是两指针有一个没有到边界值

首先是合并 p1 的情况,当 p2 已经遍历完成,或者左区间还未遍历完且左区间当前遍历到的元素值小于等于右区间的,则合并左区间元素,并递增 p1

否则合并 p2,递增 p2

代码

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root1
 * @param {TreeNode} root2
 * @return {number[]}
 */
var getAllElements = function (root1, root2) {
  const arr1 = []
  const arr2 = []
  const ret = []

  inOrder(arr1, root1)
  inOrder(arr2, root2)

  let p1 = 0,
    p2 = 0
  while (p1 < arr1.length || p2 < arr2.length) {
    if (p2 >= arr2.length || (p1 < arr1.length && arr1[p1] <= arr2[p2])) {
      ret.push(arr1[p1++])
    } else {
      ret.push(arr2[p2++])
    }
  }

  return ret
}

function inOrder(arr, root) {
  if (!root) return

  if (root.left) inOrder(arr, root.left)
  arr.push(root.val)
  if (root.right) inOrder(arr, root.right)
}