代码随想录算法训练营第二十一天 | 513.找树左下角的值、112. 路径总和、113.路径总和 II 、106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉树

目录

513.找左子树的值

思路

代码

112.路径总和

思路

代码

 113.路径总和 II 

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

思路

代码(105的)


 513.找左子树的值

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

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

思路

        这道题如果用层序遍历直接秒杀好吧,把所有结果存储下来,最后返回res[-1][0]就是答案。不过还是得学一下用递归解决,用前序中序后序都可,只要是优先处理左节点就可以。

代码
import collections
from typing import Optional


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.max_depth = float('-inf')
        self.result = None
        self.traversal(root, 0)
        return self.result

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

        if node.left:
            depth += 1
            self.traversal(node.left, depth)
            depth -= 1
        if node.right:
            depth += 1
            self.traversal(node.right, depth)
            depth -= 1

        # 迭代法
        # res = []
        # queue = collections.deque([root])
        # while queue:
        #     level = []
        #     for i in range(len(queue)):
        #         node = queue.popleft()
        #         level.append(node.val)
        #         if node.left:
        #             queue.append(node.left)
        #         if node.right:
        #             queue.append(node.right)
        #     res.append(level[:])
        #
        # return res[-1][0]

112.路径总和

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

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

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

思路

        112,和113还是有点区别的,112只要找到一个满足就返回,113要找到所有,不得不说代码一精简完全看不出原来的递归逻辑。建议看链接里的代码。

代码
from typing import Optional


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:

        def dfs(node, sum):
            if not node:
                return False

            if node.left is None and node.right is None:
                if sum + node.val == targetSum:
                    return True
                return False

            if node.left:
                left = dfs(node.left, sum + node.val)
                if left == True:
                    return True

            if node.right:
                right = dfs(node.right, sum + node.val)
                if right == True:
                    return True

            return False

        return dfs(root, 0)

 113.路径总和 II 

链接同上


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

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

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

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

思路

        学过数据结构的人应该很好理解为什么是那么切割的,不太了解的可以先看看链接。如果看的懂106,可以自己试着把105写出来。

代码(105的)
from typing import List, Optional


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)

        seperate_idx = inorder.index(root_val)

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

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

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

        return root
  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值