首页 > 编程语言 >代码随想录算法训练营day16| 513.找树左下角的值 112.路径总和 106.从中序和后序遍历构造二叉树

代码随想录算法训练营day16| 513.找树左下角的值 112.路径总和 106.从中序和后序遍历构造二叉树

时间:2024-10-15 21:10:55浏览次数:1  
标签:node right val self 随想录 二叉树 左下角 root left

学习资料:https://programmercarl.com/0513.找树左下角的值.html#算法公开课

递归、回溯
返回值:True/False, root
构建二叉树 TrueNode(root_value)

513.找树左下角的值(实例变量self.result, self.maxdepth;找到叶子节点,若深度>self.maxdepth,则更新最大深度;只考虑左和右子树,用递归+回溯)

点击查看代码
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def findBottomLeftValue(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        self.maxdepth = float('-inf')  # 实例变量,可共享到traversal函数中,设置初始值为无穷小
        self.result = None
        self.traversal(root, 0)  # 根节点的深度为0或者1好像都不影响
        return self.result       # 返回最大深度对应的叶子节点的值


    def traversal(self, node, depth):
        """这里是递归+回溯+左右,其实层序法更简单"""
        if node.left == None and node.right == None:  # 叶子节点,若深度大于设定的最大深度,则更新最大深度
            if depth > self.maxdepth:
                self.maxdepth = depth
                self.result = node.val
            return      # 因为self.result是实例变量,所以是与findBottomLeftValue同步的,不用返回值
        # 如果不是叶子节点,就向下递归,先左子树再右子树,所以要加个回溯
        if node.left:
            depth += 1     # 向下,深度增大
            self.traversal(node.left, depth)
            depth -= 1     # 回溯
        if node.right:
            depth+=1
            self.traversal(node.right, depth)
            depth -= 1
        
        

112.路径总和(往下递归时,在目标总和的基础上依次减去节点值,如果到叶子节点处总和变为0则满足题意;回溯)

点击查看代码
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def hasPathSum(self, root, targetSum):
        """
        :type root: TreeNode
        :type targetSum: int
        :rtype: bool
        """
        if not root:
            return False
        return self.traversal(root, targetSum-root.val)   # 注意代入的是 target-node.val

    def traversal(self, node, count):
        # 如果是叶子节点,当target减为0符合题目要求返回True
        if node.left == None and node.right == None:
            if count == 0:
                return True
            else:
                return False
        # 递归法,先左后右,不处理根,要回溯
        if node.left:
            count -= node.left.val
            if self.traversal(node.left, count): # 递归中代入的也是 target-node.val
                return True                      # 如果此节点满足要求,则向上传递True
            count += node.left.val
        if node.right:
            count -= node.right.val
            if self.traversal(node.right, count):
                return True
            count += node.right.val
        return False

160.从中序和后序遍历构造二叉树(根据前序或者后序找到根节点,拿到中序找到位置进行切割得到中序情况下的左右子树,然后根据长度拿到后序中得到后序情况下的左右子树,依次递归下去,就可以了;要构造一个二叉树,到时候返回这个二叉树即可)

点击查看代码
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def buildTree(self, inorder, postorder):
        """
        :type inorder: List[int]
        :type postorder: List[int]
        :rtype: TreeNode
        """
        # 第一步:递归终止条件1:
        if not postorder:
            return None
        
        # 第二步:从前序或者后序(左右根)入手,找到根节点的值,并建立目标二叉树
        root_val = postorder[-1]
        root = TreeNode(root_val)

        # 第三步:根据根节点的值,找到中序对应位置
        separator_idx = inorder.index(root_val)
        
        # 第四步:中序是左根右,所以可用根节点位置划分,得到左中序(中序排列时的左子树)、右中序
        left_inorder = inorder[:separator_idx]
        right_inorder = inorder[separator_idx+1:]

        # 第五步:回到后序(左右根),根据左子树和右子树的长度,得到左后序(后序排列时的左子树)、右后序
        left_postorder = postorder[:len(left_inorder)]
        right_postorder = postorder[len(left_inorder):-1]

        # 第六步:递归,再分别探究左子树的中序、后序,右子树的中序、后序
        root.left = self.buildTree(left_inorder, left_postorder)
        root.right = self.buildTree(right_inorder, right_postorder)

        # 返回二叉树
        return root

        

PS:今天终于出太阳了舒服,今天吃的很随性,主打一个饿了就吃

标签:node,right,val,self,随想录,二叉树,左下角,root,left
From: https://www.cnblogs.com/tristan241001/p/18468456

相关文章

  • 代码随想录算法训练营 | 188.买卖股票的最佳时机IV,309.最佳买卖股票时机含冷冻期,714.
    188.买卖股票的最佳时机IV题目链接:188.买卖股票的最佳时机IV文档讲解︰代码随想录(programmercarl.com)视频讲解︰买卖股票的最佳时机IV日期:2024-10-15想法:跟最佳时机III的区别在于dp[i][0]表示的是第i天没有操作,省去了会很麻烦。Java代码如下:classSolution{publicint......
  • 代码随想录刷题学习日记
    仅为个人记录复盘学习历程,解题思路来自代码随想录代码随想录刷题笔记总结网址:代码随想录替换数字给定一个字符串s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。提供参数:strings主要操作:将数组扩容到所有数字都......
  • 代码随想录训练营第63天|拓扑排序
    117.软件构建#include<iostream>#include<vector>#include<queue>#include<unordered_map>usingnamespacestd;intmain(){intm,n,s,t;cin>>n>>m;vector<int>inDegree(n,0);//记录每个文件的入度......
  • 代码随想录训练营第62天|最小生成树
    53.寻宝#include<iostream>#include<vector>#include<climits>usingnamespacestd;intmain(){intv,e;intx,y,k;cin>>v>>e;//填一个默认最大值,题目描述val最大为10000vector<vector<int>>grid(v+1......
  • [LeetCode] 662. 二叉树最大宽度
    题目描述:给你一棵二叉树的根节点 root ,返回树的 最大宽度 。树的 最大宽度 是所有层中最大的 宽度 。每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的 null 节点,这......
  • 代码随想录算法训练营day15| 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和
    学习资料:https://programmercarl.com/0110.平衡二叉树.html#算法公开课平衡二叉树:任意一个节点的左右子树高度差不超过1左叶子:是叶子节点,且是其父节点的左节点完全二叉树:上层均满,底层的节点从左到右连续满二叉树:每层都是满的,节点总数为(2^k+1)语法:2<<1是2^2学习记录:1......
  • 代码随想录算法训练营 | 121.买卖股票的最佳时机,122.买卖股票的最佳时机II,123.买卖股
    121.买卖股票的最佳时机题目链接:121.买卖股票的最佳时机文档讲解︰代码随想录(programmercarl.com)视频讲解︰买卖股票的最佳时机日期:2024-10-14想法:经常有用0和1表示相反状态,dp[i][0]表示第i天持有股票时身上最多的钱,比如第一天股票5元,持有了,身上的钱就为dp[0][0]=-5,第二天股......
  • 算法训练15-1判断平衡二叉树+二叉树的所有路径
    题目1:给定一个二叉树,判断它是否是 平衡二叉树  解法主要考察高度,后序遍历->需要递归法->递归法三步走/** *Definitionforabinarytreenode. *publicclassTreeNode{ *intval; *TreeNodeleft; *TreeNoderight; *TreeNode(){} *TreeNod......
  • 代码随想录算法训练营第三十四天|134. 加油站 135. 分发糖果 860.柠檬水找零 406.根据
    134.加油站在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第i个加油站开往第i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时加油站的......
  • 代码随想录算法训练营第三十二天|122.买卖股票的最佳时机 II 55. 跳跃游戏 45.跳跃游
    122.买卖股票的最佳时机II给定一个数组,它的第 i个元素是一支给定股票第i天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例1:输入:[7,1,5......