目录:
目的:
已知两颗二叉树,将它们合并成一颗二叉树。合并规则是:都存在的结点,就将结点值加起来,否则空的位置就由另一个树的结点来代替。
思路
我们有两棵二叉树,目标是将这两棵树合并成一棵新的树,规则如下:
- 如果两个节点都有值,就把它们的值加起来,生成一个新的节点。
- 如果其中一个节点没有值(即为空),就直接返回另一个节点。
- 继续递归地合并两个树的左子树和右子树。
检查工作:
- 如果两棵树的当前节点都为空 :返回
None
,表示没有节点需要合并。 - 如果一个节点为空 :如果
t1
为空,那么直接返回t2
,如果t2
为空,则返回t1
,这样合并过程中可以"跳过"空节点。
开始合并:如果两个节点都不为空
- 合并它们的值,创建一个新的节点,将这两个树的左子树和右子树递归地合并:
- 递归调用
mergeTrees(t1.left, t2.left)
合并左子树。- 递归调用
mergeTrees(t1.right, t2.right)
合并右子树。
返回合并后的树(merged
)。
复杂度
-
时间复杂度:O( n)
- 对每个节点只进行了访问一次,其中
n
是两棵树中节点的总数。
- 对每个节点只进行了访问一次,其中
-
空间复杂度:O(n )
- 递归调用栈的深度等于树的高度。在最坏的情况下(完全不平衡的树),空间复杂度为 O(n) ,在最好的情况下(平衡的树),空间复杂度为 O(log n)。
记忆秘诀
- 节点为空的情况:遇到空节点时,直接跳过返回。
- 值相加的情况:两个节点都有值时,它们的值会加起来生成一个新节点。
- 递归合并子树:左右子树分别递归合并,形成最终的合并树。
python代码
python
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def mergeTrees(self, t1: TreeNode, t2: TreeNode) -> TreeNode:
# 如果t1和t2都为空,返回空
if not t1 and not t2:
return None
# 如果t1为空,返回t2
if not t1:
return t2
# 如果t2为空,返回t1
if not t2:
return t1
# 创建新的节点,值为t1和t2的值之和
merged = TreeNode(t1.val + t2.val)
# 递归合并左子树和右子树
merged.left = self.mergeTrees(t1.left, t2.left)
merged.right = self.mergeTrees(t1.right, t2.right)
return merged # 返回合并后的树
* 欢迎大家探讨新思路,能够更好的理解和记忆