力扣——算法入门计划第八天

目录

🍕题目

 🍔DFS深度优先搜索

总体思路

🍟代码

 🍕题目

 🍔方法一:层层遍历

 🍟代码


🍕题目

617. 合并二叉树

 🍔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

 🍕题目

116. 填充每个节点的下一个右侧节点指针

 🍔方法一:层层遍历

题目让我们将二叉树的每一层节点都连接起来形成一个链表。

因此直观的做法我们可以对二叉树进行层遍历,

在层遍历的过程中将我们将二叉树每一层的节点拿出来遍历并连接。

有点类似与广度优先遍历

 

 🍟代码

详细见代码

"""
# 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

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

heart_6662

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值