目录
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