503.找树左下角的值
迭代加回溯
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 not node.left and not node.right:#如果是叶子节点
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
def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:
if root is None:
return 0
queue=deque()
queue.append(root)
result=0
while queue:
size=len(queue)
for i in range(size):
node=queue.popleft()
if i==0:
result=node.val
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return result
112.路径总和
# 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:
if root is None:
return False
return self.traversal(root,targetSum-root.val)
def traversal(self,cur:TreeNode,count:int)-> bool:
if not cur.left and not cur.right and count==0:
return True
if not cur.left and not cur.right:
return False
if cur.left:
count-=cur.left.val
if self.traversal(cur.left,count):
return True
count+=cur.left.val#回朔,撤销处理结果
if cur.right:
count-=cur.right.val
if self.traversal(cur.right,count):
return True
count+=cur.right.val
return False#全部完成都不等于返回错误
106.从中序与后序遍历构建二叉树
# 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]:
if not postorder:
return None#树为空,递归终止条件
root_val=postorder[-1]#后续遍历的最后一个节点为当前的中间节点
root=TreeNode(root_val)#设置一个新的节点
#找切割点
separator_idx=inorder.index(root_val)
inorder_left=inorder[:separator_idx]
inorder_right=inorder[separator_idx+1:]
#中序数组大小一定和后序数组大小是相同的
postorder_left=postorder[:len(inorder_left)]#后序的左半边
postorder_right=postorder[len(inorder_left):len(postorder)-1]
#以下是递归过程
root.left=self.buildTree(inorder_left,postorder_left)
root.right=self.buildTree(inorder_right,postorder_right)
return root