树的深度优先(DFS)和广度优先(BFS)算法

引言

DFS

深度优先算法:从一个节点开始,一直搜索,直到一个叶子节点或者无法搜索下去。

BFS

广度优先算法(层序遍历):从一个节点开始,逐层搜索节点。

实现

DFS(深度优先)

python 复制代码
class Solution:
    def connect(self, root: 'Node') -> 'Node':
        pre = []
        def dfs(node: 'Node', depth: int) -> None:
            if node is None:
                return
            if depth == len(pre): 
                pre.append(node)
            else:  
                pre[depth].next = node  
                pre[depth] = node
            dfs(node.left, depth + 1)
            dfs(node.right, depth + 1)
        dfs(root, 0)  
        return root

这个主要是通过一直遍历左边子树的左节点,核心思想是pre[depth].next = node pre[depth] = node,这个就直接使用将左子树的左节点作为下一个值,直到后面没有值了,这里面的一个判断if depth == len(pre)就做一个是否当前深度等于列表长度。然后就是递归左右子树,进入下一层。

BFS(广度优先/层序遍历)

python 复制代码
class Solution:
    def connect(self, root: 'Node') -> 'Node':
        if root is None:
            return None
        q = [root]
        while q:
            for x, y in pairwise(q):
                x.next = y
            tmp = q
            q = []
            for node in tmp:
                if node.left:  q.append(node.left)
                if node.right: q.append(node.right)
        return root

广度优先搜索和深度优先搜索的主要区别就是广度优先遍历是没有一直往左子树的左节点的,而是直接用pairwise将两个值进行分组,并将下一节点放在分组的另一个值上,for x,y in pairwose(q):

x.next = y,然后将所有的值添加到队列中。对了,队列是一种很适合用于层序遍历的,因为队列是先进先出,而且队列由列表表示。

相关推荐
坚持编程的菜鸟10 分钟前
LeetCode每日一题——重复的子字符串
数据结构·算法·leetcode
jndingxin33 分钟前
算法面试(6)------mAP 是什么?如何计算?P-R 曲线怎么看?
开发语言·算法
2401_841495641 小时前
【机器学习】朴素贝叶斯法
人工智能·python·数学·算法·机器学习·概率论·朴素贝叶斯法
时间醉酒2 小时前
逻辑回归(四):从原理到实战-训练,评估与应用指南
人工智能·python·算法·机器学习·逻辑回归
Zheng照邻、2 小时前
VLM Prompt优化之 DynaPrompt(ICLR 2025)论文总结
人工智能·算法·语言模型·prompt·aigc
CoovallyAIHub2 小时前
机器人“大脑”遭遇认知冻结攻击!复旦等提出FreezeVLA,一张图片即可瘫痪多模态大模型
深度学习·算法·计算机视觉
无敌最俊朗@2 小时前
死锁 (Deadlock) 深度解析
算法
西阳未落3 小时前
欧拉路径与欧拉回路
算法·深度优先
Swift社区3 小时前
LeetCode 390 消除游戏
算法·leetcode·游戏
橘颂TA4 小时前
【剑斩OFFER】优雅的解法——三数之和
算法