1.513. 找树左下角的值
给定一个二叉树的 根节点 root
,请找出该二叉树的 最底层 最左边 节点的值。
假设二叉树中至少有一个节点。
示例 1:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
输入: root = [2,1,3]
输出: 1
思路:
这道题比较简单,层序遍历就行了
# 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
from collections import dequeclass Solution:def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:# 层序遍历queue = deque()queue.append(root)res = root.valwhile queue:for i in range(len(queue)):node = queue.popleft()if i == 0:res = node.valif node.left:queue.append(node.left)if node.right:queue.append(node.right) return res
2.112. 路径总和
给你二叉树的根节点 root
和一个表示目标和的整数 targetSum
。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum
。如果存在,返回 true
;否则,返回 false
。
叶子节点 是指没有子节点的节点。
示例 1:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示。
思路:
DFS,深度优先遍历
# 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:def recur(node: Optional[TreeNode], sum_value: int):#如果是空节点if not node:return Falsesum_value += node.val# 如果是叶子节点if not node.left and not node.right:return sum_value == targetSumreturn recur(node.left, sum_value) or recur(node.right, sum_value)return recur(root, 0)
3.106. 从中序与后序遍历序列构造二叉树
给定两个整数数组 inorder
和 postorder
,其中 inorder
是二叉树的中序遍历, postorder
是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
示例 1:
输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
输出:[3,9,20,null,null,15,7]
思路
注意写的递归函数,传参不要使用list
写一个dict优化index获取时间
# 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]:# 构造一个字典存储inorder每个元素和对应的idx关系inorder_v_idx = {num: i for i, num in enumerate(inorder)}# 左根右, 左右根def getTree(inorder_left_idx, inorder_right_idx, postorder_left_idx, postorder_right_idx) -> Optional[TreeNode]:if inorder_left_idx >= inorder_right_idx:return Noneinorder_root_idx = inorder_v_idx.get(postorder[postorder_right_idx - 1])root = TreeNode(postorder[postorder_right_idx - 1])root.left = getTree(inorder_left_idx, inorder_root_idx, postorder_left_idx, postorder_left_idx + inorder_root_idx - inorder_left_idx)root.right = getTree(inorder_root_idx + 1, inorder_right_idx, postorder_left_idx + inorder_root_idx - inorder_left_idx, postorder_right_idx - 1)return rootreturn getTree(0, len(inorder), 0 ,len(postorder))