LeetCode 1305「两棵二叉搜索树中的所有元素」

Posted 陈皮的JavaLib

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1305「两棵二叉搜索树中的所有元素」相关的知识,希望对你有一定的参考价值。

我是陈皮,一个在互联网 Coding 的 ITer,微信搜索「陈皮的JavaLib」第一时间阅读最新技术文章。回复【资料】,即可获得我精心整理的技术资料,电子书籍,一线大厂面试资料和优秀简历模板。

文章目录

题目

给你 root1 和 root2 这两棵二叉搜索树。请你返回一个列表,其中包含两棵树中的所有整数并按升序排序。

示例1:

  • 输入:root1 = [2,1,4], root2 = [1,0,3]
  • 输出:[0,1,1,2,3,4]

示例2:

  • 输入:root1 = [1,null,8], root2 = [8,1]
  • 输出:[1,1,8,8]

提示:

  • 每棵树的节点数在 [0, 5000] 范围内
  • -10^5 <= Node.val <= 10^5

题目来源:LeetCode

分析

二叉搜索树的定义:

  • 当前节点的左子树中的数均小于当前节点的数。
  • 当前节点的右子树中的数均大于当前节点的数。
  • 所有左子树和右子树自身也是二叉搜索树。

使用中序遍历访问一颗二叉搜索树,即先访问左子树,再访问根节点。最后访问右子树。那么可以得到一个有序数组。

这样,我们可以使用中序遍历对2棵树进行访问,得到2个有序数组。然后再使用2个指针遍历2个有序数组,进行合并到另一个有序数组中即可。

实现

package com.chenpi.no1315GetAllElements;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description
 * @Author 陈皮
 * @Date 2022/5/1
 * @Version 1.0
 */
public class No1315GetAllElements 

  public static void main(String[] args) 
    No1315GetAllElements inst = new No1315GetAllElements();

    TreeNode root1 = new TreeNode(2, new TreeNode(1), new TreeNode(4));
    TreeNode root2 = new TreeNode(1, new TreeNode(0), new TreeNode(3));
    System.out.println(inst.getAllElements(root1, root2));
  

  public List<Integer> getAllElements(TreeNode root1, TreeNode root2) 

    // 获取有序数组
    List<Integer> orderList1 = new ArrayList<>();
    inOrder(root1, orderList1);

    // 获取有序数组
    List<Integer> orderList2 = new ArrayList<>();
    inOrder(root2, orderList2);

    List<Integer> list = new ArrayList<>();
    int i = 0, j = 0;
    while (i < orderList1.size() || j < orderList2.size()) 
      if (i == orderList1.size()) 
        list.add(orderList2.get(j++));
        continue;
      
      if (j == orderList2.size()) 
        list.add(orderList1.get(i++));
        continue;
      
      if (orderList1.get(i) < orderList2.get(j)) 
        list.add(orderList1.get(i++));
       else 
        list.add(orderList2.get(j++));
      
    

    return list;
  

  // 中序遍历
  private void inOrder(TreeNode root, List<Integer> orderList) 
    // 空节点,则返回
    if (root == null) 
      return;
    
    // 遍历左子树
    inOrder(root.left, orderList);
    // 当前值
    orderList.add(root.val);
    // 遍历右子树
    inOrder(root.right, orderList);
  


// Definition for a binary tree node.
class TreeNode 

  int val;
  TreeNode left;
  TreeNode right;

  TreeNode() 
  

  TreeNode(int val) 
    this.val = val;
  

  TreeNode(int val, TreeNode left, TreeNode right) 
    this.val = val;
    this.left = left;
    this.right = right;
  


// 输出结果如下
[0, 1, 1, 2, 3, 4]

Leetcode 执行结果:


本次分享到此结束啦~~

如果觉得文章对你有帮助,点赞、收藏、关注、评论,您的支持就是我创作最大的动力!

以上是关于LeetCode 1305「两棵二叉搜索树中的所有元素」的主要内容,如果未能解决你的问题,请参考以下文章

[leetcode] 1305. 两棵二叉搜索树中的所有元素 | 遍历

LeetCode 1305「两棵二叉搜索树中的所有元素」

LeetCode 1305「两棵二叉搜索树中的所有元素」

LeetCode 1305 两棵二叉搜索树中的所有元素[dfs 归并] HERODING的LeetCode之路

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

LeetCode 908. 最小差值 I / 1305. 两棵二叉搜索树中的所有元素 / 591. 标签验证器