当前位置: 首页 > article >正文

代码随想录算法训练营第十六天| 二叉树4

513. 找树左下角的值

本题递归偏难,反而迭代简单属于模板题, 两种方法掌握一下

题目链接/文章讲解/视频讲解:代码随想录

状态:递归,需看讲解

 先左后右遍历子树,因此,在得到底层最左边的叶子后,结果不会因为找到右边的叶子而更新

# 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 findBottomLeftValue(self, root: Optional[TreeNode]) -> int:
        self.result=None
        self.max_depth=float('-inf')
        self.traversal(root,0)
        return self.result

    def traversal(self,node,depth):
        if not node:
            return 
        if not node.left and not node.right:
            if depth>self.max_depth:
                self.max_depth=depth
                self.result=node.val
        self.traversal(node.left,depth+1)
        self.traversal(node.right,depth+1)

112. 路径总和

本题 又一次涉及到回溯的过程,而且回溯的过程隐藏的还挺深,建议先看视频来理解

112. 路径总和,和 113. 路径总和ii 一起做了。 优先掌握递归法。

题目链接/文章讲解/视频讲解:代码随想录

状态:递归加回溯,需要看思路

# 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 hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
        if not root:
            return False
        return self.traveral(root,targetSum-root.val)
                
    def traveral(self,node,count):
        if not node.left and not node.right and count==0:
            return True
        if not node.left and not node.right:
            return False
        if node.left:
            count-=node.left.val
            if self.traveral(node.left,count):
                return True
            count+=node.left.val
        if node.right:
            count-=node.right.val
            if self.traveral(node.right,count):
                return True
            count+=node.right.val
        return False

113. 路径总和II

题目链接:113. 路径总和 II - 力扣(LeetCode)

 self.result.append(self.cur[:])

[:] 是切片操作符,self.cur[:] 会创建一个新的列表,它是 self.cur 的拷贝(深拷贝)。 如果直接使用 self.result.append(self.cur),那么 self.result 中存储的是 self.cur 的引用。当 self.cur 在后续递归或回溯中发生改变时,self.result 中的路径也会跟着改变,这不是我们想要的行为。 使用 [:] 可以确保将当前路径的快照(即一个独立的副本)添加到结果中,即使后续修改了 self.cur,也不会影响 self.result 中已经保存的路径。

# 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 pathSum(self, root: Optional[TreeNode], targetSum: int) -> List[List[int]]:
        self.result=[]
        if not root:
            return self.result
        self.cur=[root.val]
        self.traveral(root,targetSum-root.val)
        return self.result

    def traveral(self,node,count):
        if not node.left and not node.right and count==0:
            self.result.append(self.cur[:])
            return
        if not node.left and not node.right:
            return 
        if node.left:
            self.cur.append(node.left.val)
            count-=node.left.val
            self.traveral(node.left,count)
            count+=node.left.val
            self.cur.pop()
        if node.right:
            self.cur.append(node.right.val)
            count-=node.right.val
            self.traveral(node.right,count)
            count+=node.right.val
            self.cur.pop()
        return 

106. 从中序与后序遍历序列构造二叉树

 本题算是比较难的二叉树题目了,大家先看视频来理解。

106.从中序与后序遍历序列构造二叉树,105.从前序与中序遍历序列构造二叉树 一起做,思路一样的

题目链接/文章讲解/视频讲解:代码随想录

状态:看讲解

 需对列表进行切分

# 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 buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
        if not preorder:
            return None
        root_val=preorder[0]
        root=TreeNode(root_val)
        seperator_idx=inorder.index(root_val)

        inorder_left=inorder[:seperator_idx]
        inorder_right=inorder[seperator_idx+1:]

        preorder_left=preorder[1:1+len(inorder_left)]
        preorder_right=preorder[1+len(inorder_left):]

        root.left=self.buildTree(preorder_left,inorder_left)
        root.right=self.buildTree(preorder_right,inorder_right)
        return root

105. 从前序与中序遍历序列构造二叉树

# 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 buildTree(self, inorder: List[int], postorder: List[int]) -> Optional[TreeNode]:
        if not postorder:
            return None

        root_val = postorder[-1]
        root = TreeNode(root_val)

        separator_idx = inorder.index(root_val)

        inorder_left = inorder[:separator_idx]
        inorder_right = inorder[separator_idx + 1:]

        postorder_left = postorder[:len(inorder_left)]
        postorder_right = postorder[len(inorder_left): len(postorder) - 1]

        root.left = self.buildTree(inorder_left, postorder_left)
        root.right = self.buildTree(inorder_right, postorder_right)

        return root

 


http://www.kler.cn/a/530168.html

相关文章:

  • LeetCode:300.最长递增子序列
  • webrtc协议详细解释
  • SQL Server查询计划操作符(7.3)——查询计划相关操作符(5)
  • 想品客老师的第天:类
  • https的原理
  • 好用的翻译工具
  • 【论文复现】基于Otsu方法的多阈值图像分割改进鲸鱼优化算法
  • LLMs之OpenAI o系列:OpenAI o3-mini的简介、安装和使用方法、案例应用之详细攻略
  • 【每天学习一点点】通过使用@property装饰器来创建一个属性的getter和setter方法
  • 【周易哲学】生辰八字入门讲解(八)
  • STM32 DMA数据转运
  • leetcode 930. 和相同的二元子数组
  • 【人工智能】使用Python和Hugging Face构建情感分析应用:从模型训练到Web部署
  • ASP.NET Core Filter
  • 一文讲解Java中HashMap的put流程
  • 完全卸载mysql server步骤
  • Unity游戏(Assault空对地打击)开发(3) 摄像机的控制
  • C# 精炼题18道题(类,三木运算,Switch,计算器)
  • DeepSeek与OpenAI:谁是AI领域的更优选择?
  • 04树 + 堆 + 优先队列 + 图(D1_树(D8_B*树(B*)))
  • 书生大模型实战营7
  • openmv的端口被拆分为两个 导致电脑无法访问openmv文件系统解决办法 openmv USB功能改动 openmv驱动被更改如何修复
  • 人工智能学习(四)之机器学习基本概念
  • work-stealing算法 ForkJoinPool
  • 【C语言】填空题/程序填空题1
  • 第三百六十节 JavaFX教程 - JavaFX 进度显示器