[前端]_一起刷leetcode 1305. 两棵二叉搜索树中的所有元素

106 阅读2分钟

大家好,我是挨打的阿木木,爱好算法的前端摸鱼老。最近会频繁给大家分享我刷算法题过程中的思路和心得。如果你也是想提高逼格的摸鱼老,欢迎关注我,一起学习。

题目

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

给你 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] 之间。

思路

这道题目首先得明白二叉搜索树的概念,二叉搜索树是中序遍历单调递增的一颗树,如果还不知道什么是中序遍历可以看我之前的这篇文章:一文彻底搞懂二叉树的前序、中序、后序遍历

  1. 首先通过迭代的方式来遍历两颗二叉搜索树,用两个栈来存储节点;
  2. 分别找到两颗树的中序遍历中的第一个节点;
  3. 然后依次比较两个栈中的末尾元素,把最小值push进结果数组中去;
  4. 一直循环到遍历完了一颗树后,把剩余树单独遍历完即可。

实现

/**
 * 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) {
    let stack1 = root1 ? [ root1 ] : [], 
        stack2 = root2 ? [ root2 ] : [];
    let result = [];

    // 如果两个栈都不为空,比较栈中最后一个元素的大小,把最小值放到结果数组中去
    while (stack1.length && stack2.length) {
        let last1 = stack1[stack1.length - 1],
            last2 = stack2[stack2.length - 1];

        // 找到最左子节点
        while (last1.left) {
           stack1.push(last1.left);
           last1.left = null;
           last1 = stack1[stack1.length - 1];
        }

        // 找到最右子节点
        while (last2.left) {
           stack2.push(last2.left);
           last2.left = null;
           last2 = stack2[stack2.length - 1];
        }

        // 两者间的最小值出栈
        if (last1.val <= last2.val) {
            result.push(last1.val);
            stack1.pop();
            last1.right && stack1.push(last1.right);
        } else {
            result.push(last2.val);
            stack2.pop();
            last2.right && stack2.push(last2.right);
        }
    }

    getStackNode(stack1, result);
    getStackNode(stack2, result);

    return result;
};

// 朴实无华的中序遍历
function getStackNode(stack, result) {
    while (stack.length) {
        let last = stack[stack.length - 1];
        if (last.left) {
            stack.push(last.left);
            last.left = null;
        } else {
            result.push(last.val);
            stack.pop();
            last.right && stack.push(last.right);
        }
    }
}

结果

image.png

看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。