Leetcode笔记 每日一题 1305. 两棵二叉搜索树中的所有元素(22.05.01)

Leetcode笔记 每日一题 1305. 两棵二叉搜索树中的所有元素(22.05.01)

Leetcode 每日一题 1305. 两棵二叉搜索树中的所有元素(22.05.01)

题目

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

示例1:

示例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] 范围内
-105 <= Node.val <= 105

解题思路

题目要求我们返回一个列表包含两颗二叉树的所有整数节点并按有序排列。因此可以利用中序遍历结果是有序的,对两颗二叉树进行遍历,并把结果存放于列表res中,然后对res进行排序即可。

Python代码

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def getAllElements(self, root1: TreeNode, root2: TreeNode) -> List[int]:
        # 中序遍历
        def inorder(root , nums):
            if not root:
                return
            inorder(root.left , nums)
            nums.append(root.val)
            inorder(root.right , nums)
        
        nums = []
        inorder(root1 , nums)
        inorder(root2 , nums)
        nums = sorted(nums) # 使用sorted()进行排序
        return nums

以下是不使用sorted()函数进行排序

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def getAllElements(self, root1, root2):
        def inorder(root, nums):
            if not root:
                return
            inOrder(root.left, nums)
            nums.append(root.val)
            inOrder(root.right, nums)
        # 分别初始化两个列表存放两颗二叉树中序遍历的结果
        nums1 = [] 
        nums2 = []
        inorder(root1, nums1)
        inorder(root2, nums2)
    
        res = []
        i , j = 0 , 0
        while i < len(nums1) and j < len(nums2):
            if nums1[i] < nums2[j]:
                res.append(nums1[i])
                i += 1
            else:
                res.append(nums2[j])
                j += 1
         # 存在nums1和nums2长度不同的情况
         # 当i<len(nums1)或者j<len(nums2)时,说明nums2(nums1)的数已经比较完了,nums1(nums2)剩下的数都会比nums2(nums1)最后一个数大,所以直接将nums1[i:](nums2[j:])后面的数插入res后面
        '''
        if i < len(nums1): 
            res.extend(nums1[i:])
        if j < len(nums2):
            res.extend(nums2[j:])
        '''
        res.extend(nums1[i:]+nums2[j:])  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值