Leedcode 第九天 二叉树4 python
Posted 又南又难
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leedcode 第九天 二叉树4 python相关的知识,希望对你有一定的参考价值。
题目来源力扣
257. 二叉树的所有路径
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点。
# 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 binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
path=[]
def path_(node,res):
nonlocal path
if node==None:
return
res.append(node.val)
if node.left==None and node.right==None:
path.append(('->').join(str(x) for x in res))
path_(node.left,res)
path_(node.right,res)
res.pop()
res=[]
path_(root,res)
return path
100. 相同的树
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
# 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 isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
def compare(node_p,node_q):
if node_p==None and node_q==None:
return True
elif node_p!=None and node_q==None:
return False
elif node_p==None and node_q!=None:
return False
elif node_p!=None and node_q!=None:
if node_p.val!=node_q.val:
return False
a=compare(node_p.left,node_q.left)
b=compare(node_p.right,node_q.right)
return a and b
return compare(p,q)
404. 左叶子之和
给定二叉树的根节点 root ,返回所有左叶子之和。
# 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:
sum_=0
def sum_left(node):
nonlocal sum_
if node==None:
return
if node.left!=None and node.left.left==None and node.left.right==None:
sum_=sum_+node.left.val
sum_left(node.left)
sum_left(node.right)
sum_left(root)
return sum_
#############另一种
if(root==None):
return 0
mid=0
left_=self.sumOfLeftLeaves(root.left)
right_=self.sumOfLeftLeaves(root.right)
if root.left!=None and root.left.left==None and root.left.right==None:
mid=root.left.val
sum_=0
sum_=mid+left_+right_
return sum_
513. 找树左下角的值
给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。
假设二叉树中至少有一个节点。
# 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 findBottomLeftValue(self, root: Optional[TreeNode]) -> int:
que=[]
if root.left==None and root.right==None:
return root.val
if root.left:
que.append(root.left)
if root.right:
que.append(root.right)
while(len(que)!=0):
first_child=que[0]
size=len(que)
for i in range (size):
child=que.pop(0)
if child.left:
que.append(child.left)
if child.right:
que.append(child.right)
if len(que)==0:
return first_child.val
112. 路径总和
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
叶子节点 是指没有子节点的节点。
# 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:
path_sum=[]
def dfs(node,sum_):
if node==None:
return
if node.left==None and node.right==None:
sum_=sum_+node.val
path_sum.append(sum_)
return
sum_=sum_+node.val
dfs(node.left,sum_)
dfs(node.right,sum_)
sum_=sum_-node.val
sum_=0
dfs(root,sum_)
print(path_sum)
if targetSum in path_sum:
return True
else:
return False
113. 路径总和 II
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
叶子节点 是指没有子节点的节点。
# 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 pathSum(self, root: Optional[TreeNode], targetSum: int) -> List[List[int]]:
path_all=[]
path_=[]
def dfs(node,target):
nonlocal path_all
if node==None:
return
if node.left==None and node.right==None:
path_.append(node.val)
if sum(path_)==target:
path_all.append(path_[:])
return
path_.append(node.val)
if node.left:
dfs(node.left,target)
path_.pop()
if node.right:
dfs(node.right,target)
path_.pop()
dfs(root,targetSum)
return path_all
剑指offer——python第4题重建二叉树
题目描述
解题思路
用递归思想
前序遍历是{1,2,4,7,3,5,6,8},中序遍历是{4,7,2,1,5,3,8,6},可以知道1是根节点,则在中序遍历中,4,7,2都是1的左子树,5,3,8,6都是1的右子树;从前序遍历又可以知道2是1的左子节点,是1的左子树中“根节点”的存在;3是1的右子节点,是1的右子树中“根节点”的存在;因而可以不断递归,直至明确每个节点的位置
给出代码:
class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None class Solution: # 返回构造的TreeNode根节点 def reConstructBinaryTree(self, pre, tin): # write code here if len(pre) == 0: return None if len(pre) == 1: return TreeNode(pre[0]) else: res = TreeNode(pre[0]) res.left = self.reConstructBinaryTree(pre[1: tin.index(pre[0]) + 1], tin[: tin.index(pre[0])]) res.right = self.reConstructBinaryTree(pre[tin.index(pre[0]) + 1: ], tin[tin.index(pre[0]) + 1: ]) return res
以上是关于Leedcode 第九天 二叉树4 python的主要内容,如果未能解决你的问题,请参考以下文章