目录
1. 问题描述
给你 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
2. 思路与算法
对于一棵二叉树要对所有节点进行升序排列的话用中序遍历即可。
现在有两棵树。
最直接的办法就是分别对两棵树进行中序遍历得到各自的有序列表,然后再类似于merge-sort中的merge步骤进行两张表的合并。
中序遍历用于深度优先搜索的方式实现,基本流程如下:
dfs(curRoot):
如果curRoot.左子节点非空,dfs(curRoot.左子节点)
add curRoot to the list
如果curRoot.右子节点非空,dfs(curRoot.右子节点)
3. 代码实现
# 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 dfs(curRoot):
if curRoot == None:
return []
ans = []
if curRoot.left != None:
ans.extend(dfs(curRoot.left))
ans.append(curRoot.val)
if curRoot.right != None:
ans.extend(dfs(curRoot.right))
return ans
lst1 = dfs(root1)
lst2 = dfs(root2)
ptr1,ptr2 = 0,0
mergedLst = []
while True:
if ptr1==len(lst1):
mergedLst.extend(lst2[ptr2:])
break
if ptr2==len(lst2):
mergedLst.extend(lst1[ptr1:])
break
if lst1[ptr1]<=lst2[ptr2]:
mergedLst.append(lst1[ptr1])
ptr1 += 1
else:
mergedLst.append(lst2[ptr2])
ptr2 += 1
return mergedLst
执行用时:408 ms, 在所有 Python3 提交中击败了9.62%的用户
内存消耗:24.1 MB, 在所有 Python3 提交中击败了52.88%的用户
瞄了一眼官解,也就是这个思路(中序遍历和归并排序),看来是我代码写的太差。。。