Day 18 代码随想录

文章介绍了如何解决三个关于二叉树的问题:1)使用层序遍历找到树的左下角值;2)通过递归计算二叉树路径总和;3)根据中序和后序遍历序列构建二叉树。方法包括利用队列进行层序遍历,递归处理路径总和以及利用后序遍历的特性来构建树结构。
摘要由CSDN通过智能技术生成


513. 找树左下角的值

找树左下角的值
在这里插入图片描述
 这题使用层序遍历比较简单,但是好久没写层序遍历了,有几个注意先。

1.size 需要在 que 的后面。
2. res 在 for 的前面。

class Solution:
    def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:
        if not root:
            return []
        result=[]
        from collections import deque
        que=deque([root])
        while que:
            size=len(que)
            res=[]
            for _ in range(size):
                cur=que.popleft()
                res.append(cur.val)
                if cur.left:
                    que.append(cur.left)
                if cur.right:
                    que.append(cur.right)
            result.append(res)
        return result[-1][0]

112. 路径总和

路径总和
在这里插入图片描述
 本题使用递归的方法,其中的原理还需要仔细考虑。

class Solution:
    def hasPathSum(self, root: Optional[TreeNode], target: int) -> bool:
        
        def traveral(root,target):
            if (not root.left) and (not root.right) and target==0:
                return True
            if (not root.left) and (not root.right):
                return False
            if root.left:
                target-=root.left.val
                if traveral(root.left,target):return True
                target+=root.left.val
            if root.right:
                target-=root.right.val
                if traveral(root.right,target):return True
                target+=root.right.val
            return False
        if root==None:
            return False
        else:
            return traveral(root,target-root.val)

根据所有路径改编

 这个涉及到浅拷贝与深拷贝的问题。字符串是不可变的,见链接:浅拷贝与深拷贝

class Solution:
    def hasPathSum(self, root: Optional[TreeNode], target: int) -> bool:
        path = []
        result = []
        if not root: return False
        self.traveral(root, path, result)
        for i in result:
            if sum(i)==target:
                return True
        return False

    def traveral(self, cur, path, result):
        path.append( cur.val)
        if not cur.left and not cur.right:
            result.append(path)
        if cur.left:
            self.traveral(cur.left, path[:] , result)
        if cur.right:
            self.traveral(cur.right, path[:] , result)

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

 题目链接:从中序与后序遍历序列构造二叉树
 这题分为六个步骤:

  1. 处理特殊情况
  2. 后序遍历的最后一个就是当前的中间节点
  3. 寻找切割点
  4. 切割inorder数组. 得到inorder数组的左,右半边.
  5. 切割inorder数组. 得到inorder数组的左,右半边.
  6. 第六步: 递归
class Solution:
    def buildTree(self, inorder, postorder) :
        if not postorder:
            return
        # 后序遍历的最后一个就是当前的中间节点
        root_val=postorder[-1]
        root=TreeNode(root_val)
        # 寻找切割点
        root_index=inorder.index(root_val)
        #切割inorder数组. 得到inorder数组的左,右半边.
        left_inorder=inorder[:root_index]
        right_inorder=inorder[root_index+1:]
        #切割inorder数组. 得到inorder数组的左,右半边.
        left_postorder=postorder[:len(left_inorder)]
        right_postorder=postorder[len(left_inorder):len(postorder)-1]
        # 第六步: 递归
        root.left = self.buildTree(left_inorder, left_postorder)
        root.right = self.buildTree(right_inorder, right_postorder)
        return root
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值