给定二叉树的根节点 root
,返回所有左叶子之和。
这道题是求二叉树中所有左叶子节点的值的和。使用递归的方法来解决。首先判断根节点是否为空,如果是,则直接返回0。然后定义一个变量sum来记录左叶子节点的值的和,初始值为0。接着判断根节点的左子节点是否存在,并且左子节点的左子节点和右子节点都不存在,如果满足条件,则将左子节点的值加到sum中。然后递归调用sumOfLeftLeaves函数来计算左子树中左叶子节点的值的和,并将结果加到sum中。再递归调用sumOfLeftLeaves函数来计算右子树中左叶子节点的值的和,并将结果加到sum中。最后返回sum即可。
from typing import Optional
# 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 sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
if root is None:
return 0
sum = 0
if root.left and root.left.left is None and root.left.right is None:
sum += root.left.val
return sum + self.sumOfLeftLeaves(root.left) + self.sumOfLeftLeaves(root.right)
给定一个二叉树的 根节点 root
,请找出该二叉树的 最底层 最左边 节点的值。
假设二叉树中至少有一个节点。
这道题是要找出二叉树中最底层最左边的节点的值。使用广度优先搜索(BFS)的方法来解决。
i==0
,则更新res为当前节点的值。# Definition for a binary tree node.
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:
queue = collections.deque([root])
res = root.val
while queue:
sz = len(queue)
for i in range(sz):
node = queue.popleft()
if i == 0:
res = node.val
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return res
给你二叉树的根节点 root
和一个表示目标和的整数 targetSum
。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum
。如果存在,返回 true
;否则,返回 false
。
叶子节点 是指没有子节点的节点。
这道题是判断二叉树中是否存在一条从根节点到叶子节点的路径,使得路径上所有节点值的和等于给定的目标和targetSum。使用广度优先搜索(BFS)的方法来解决。
# Definition for a binary tree node.
import collections
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
from typing import Optional
class Solution:
def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
if not root:
return False
node_queue = collections.deque([root])
val_queue = collections.deque([root.val])
while node_queue:
node = node_queue.popleft()
val = val_queue.popleft()
if not node.left and not node.right: # 叶子
if targetSum==val:
return True
if node.left:
node_queue.append(node.left)
val_queue.append(node.left.val+val)
if node.right:
node_queue.append(node.right)
val_queue.append(node.right.val+val)
return False
给定两个整数数组 inorder
和 postorder
,其中 inorder
是二叉树的中序遍历, postorder
是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
中序遍历:左根右
后序遍历:左右根
因此postorder的最后一个就是根节点
深度优先搜索(DFS)
# Definition for a binary tree node.
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, inorder: List[int], postorder: List[int]) -> Optional[TreeNode]:
def dfs(l, r) -> TreeNode:
if l > r:
return None
val = postorder.pop()
root = TreeNode(val)
idx = mp[val]
root.right = dfs(idx + 1, r)
root.left = dfs(l, idx - 1)
return root
mp = {}
for i in range(len(inorder)):
mp[inorder[i]] = i
return dfs(0, len(inorder) - 1)
给定一个不重复的整数数组 nums
。 最大二叉树 可以用下面的算法从 nums
递归地构建:
nums
中的最大值。返回 nums
构建的 最大二叉树 。
使用深度优先搜索(DFS)
# Definition for a binary tree node.
from typing import Optional, List
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
def dfs(l, r) -> TreeNode:
if l > r:
return None
mx = nums[l]
idx = l
for i in range(l, r + 1):
if nums[i] > mx:
mx = nums[i]
idx = i
root = TreeNode(mx)
root.left = dfs(l, idx - 1)
root.right = dfs(idx + 1, r)
return root
return dfs(0, len(nums) - 1)