看了一圈,也没直接归并的两棵树的,都是先遍历得到线性,然后再归并。
主要难点感觉还是在你如何控制两个树的同时遍历吧,所以我把寻找下一个点的函数单独拎了出来
然后,把边界判断的部分放在了主函数中。
结构一般,如果有想法可以在下面提,虽然我大概率不会改了(
# 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