目录
🍕题目
🍔DFS深度优先搜索
总体思路
可以使用深度优先搜索合并两个二叉树。
从根节点开始同时遍历两个二叉树,不断向下搜索直达最后,并将对应的节点进行合并。
两个二叉树的对应节点可能存在以下三种情况,对于每种情况使用不同的合并方式。
1)如果两个二叉树的对应节点都为空,
则合并后的二叉树的对应节点也为空;
2)如果两个二叉树的对应节点只有一个为空,
则合并后的二叉树的对应节点为其中的非空节点;
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 mergeTrees(self, t1: TreeNode, t2: TreeNode) -> TreeNode:
if not t1:
return t2
if not t2:
return t1
merged = TreeNode(t1.val + t2.val)
merged.left = self.mergeTrees(t1.left, t2.left)
merged.right = self.mergeTrees(t1.right, t2.right)
return merged
🍕题目
🍔方法一:层层遍历
题目让我们将二叉树的每一层节点都连接起来形成一个链表。
因此直观的做法我们可以对二叉树进行层遍历,
在层遍历的过程中将我们将二叉树每一层的节点拿出来遍历并连接。
有点类似与广度优先遍历
🍟代码
详细见代码
"""
# Definition for a Node.
class Node:
def __init__(self, val: int = 0, left: 'Node' = None, right: 'Node' = None, next: 'Node' = None):
self.val = val
self.left = left
self.right = right
self.next = next
"""
import collections
class Solution:
def connect(self, root: 'Node') -> 'Node':
if not root: #没有根节点就返回无
return root
# 初始化队列同时将第一层节点加入队列中,即根节点
Q = collections.deque([root])
# 外层的 while 循环迭代的是层数
while Q:
# 记录当前队列大小
size = len(Q)
# 遍历这一层的所有节点
for i in range(size):
# 从队首取出元素
node = Q.popleft()
# 连接
if i < size - 1:
node.next = Q[0]
# 拓展下一层节点
if node.left:
Q.append(node.left)
if node.right:
Q.append(node.right)
# 返回根节点
return root