树做题总结(一)[j34,94,1372] DFS

这篇博客探讨了三种不同的二叉树问题的解决方案:寻找和为特定值的路径、找到最长交错路径以及中序遍历。通过深度优先搜索(DFS)策略,我们可以有效地遍历树节点并解决这些问题。对于和为目标值的路径,从根节点开始,递归地检查每个子节点,直到找到满足条件的路径。最长交错路径问题则需要记录路径方向,根据方向变化更新路径长度。中序遍历则遵循左-根-右的顺序遍历节点。这些算法都利用了递归和树的结构特性来高效地解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

34. 二叉树中和为某一值的路径

在这里插入图片描述
思路:采用深度优先搜索的方式,枚举每一条从根节点到叶子节点的路径。当我们遍历到叶子节点,且此时路径和恰为目标和时,我们就找到了一条满足条件的路径。
注意:在为叶子节点的前提下不断判断当前target是否等于路径和
代码:

class Solution:
    def pathSum(self, root: TreeNode, target: int) -> List[List[int]]:
        ret = []
        path = []
        def dfs(root,target):
            if not root:
                return
            path.append(root.val)
            target = target-root.val
            if not root.right and not root.left and target==0:
                ret.append(path[:])
            dfs(root.left,target)
            dfs(root.right,target)
            path.pop()
            
        dfs(root,target)
        return ret

1372. 二叉树中的最长交错路径

在这里插入图片描述

思路:记录当前结点是左/右孩子,即记录当前路径的方向.搜索其孩子时,根据上一条路径方向判断。如果当前路径方向相反,路径长度+1,如果相同,路径长度置为1
注意:max函数更新最大值
代码:

class Solution:
    def longestZigZag(self, root: TreeNode) -> int:
        def dfs(root,length,direction):
            if not root:
                return
            nonlocal res
            res = max(res,length)
            if direction == 1:
                dfs(root.right,length+1,direction*-1)
                dfs(root.left,1,1)
            else:
                dfs(root.left,length+1,direction*-1)
                dfs(root.right,1,-1)
        res = 0
        dfs(root,0,1)
        dfs(root,0,-1)
        return res

94. 二叉树的中序遍历

在这里插入图片描述

思路:中序遍历,那就按照 左-打印-右这种顺序遍历树就可以了,递归函数实现;终止条件:当前节点为空时;函数内:递归的调用左节点,打印当前节点,再递归调用右节点
注意:数组记录打印值
代码:

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        ans=[]
        def dfs(root,ans):
            if not root:
                return ans
            dfs(root.left,ans)
            ans.append(root.val)
            dfs(root.right,ans)
        dfs(root,ans)
        return ans
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值