1305. 两棵二叉搜索树中的所有元素(直接归并两棵树,py版本)

看了一圈,也没直接归并的两棵树的,都是先遍历得到线性,然后再归并。

主要难点感觉还是在你如何控制两个树的同时遍历吧,所以我把寻找下一个点的函数单独拎了出来
然后,把边界判断的部分放在了主函数中。
结构一般,如果有想法可以在下面提,虽然我大概率不会改了(

# 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]:
        ret = []
        root = [root1, root2]
        ls = [[], []]
        def get_next(judge)->int:
	        # 就是正常的中序,只不过少了外面的一层while循环
	        # 然后因为我懒得区分哪颗树,所以整了一个骚活,如果追求可读性建议还是分开
            while root[judge]:
                ls[judge].append(root[judge])
                root[judge] = root[judge].left
            root[judge] = ls[judge].pop()
            ret = root[judge].val
            root[judge] = root[judge].right
            return ret

        if all(root):
	        # 两棵树都非空,直接进行归并
            val1 = get_next(0)
            val2 = get_next(1)
            while (ls[0] or root[0]) and (ls[1] or root[1]):
                # print(val1, val2, root, ls)
                if val1 < val2:
                    ret.append(val1)
                    val1 = get_next(0)
                else:
                    ret.append(val2)
                    val2 = get_next(1)
            '''当前还有val1和val2呢,这两个没有放进去'''
            if val1 < val2:
                val = val2
                ret.append(val1)
            else:
                val = val1
                ret.append(val2)
        else:
        	# 注意如果初始有树为空,我们还是要定义一个val,方便后续比较
            val = 10**5+1
        # 此时是只有一个树还有东西
        while ls[0] or root[0]:
            val1 = get_next(0)
            if val < val1:
                ret.append(val)
                val = 10**5+1
            ret.append(val1)
        while ls[1] or root[1]:
            val2 = get_next(1)
            if val < val2:
                ret.append(val)
                val = 10**5+1
            ret.append(val2)
        if val != 10**5+1:
            ret.append(val)
        return ret
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值