1. 左叶子之和:
题目链接: 404. 左叶子之和 - 力扣(LeetCode)
应用条件:深度遍历,递归
难点:
递归法:
本题难点在于如果想找左叶子节点,不能从当前节点本身判断,而是要根据他的父节点怕判断这个节点是不是左叶子节点,判断条件为cur.left!=None and cur.left.left == None and cur.left.right == None
个人错误:
由于判断条件过长而不敢往下写。
思路:
如下
# 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 not root:
return []
ress =[]
self.finle(root,ress)
inres = 0
for i in ress:
inres += i
return inres
def finle(self,cur,res):
if cur == None:
return
if cur.left!=None and cur.left.left == None and cur.left.right == None:
res.append(cur.left.val)
self.finle(cur.left,res)
self.finle(cur.right,res)
2. 找树左下角的值:
题目链接: 513. 找树左下角的值 - 力扣(LeetCode)
应用条件:层序遍历
难点:
本题很容易想到层序遍历,层序遍历每层再找出最后一层的最左边的元素即可。
个人错误:
思路:
如下
class Solution:
def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:
if not root:
return None
que = deque()
que.append(root)
res =[]
while que:
resse = []
for i in range(len(que)):
cur = que.popleft()
resse.append(cur.val)
if cur.right:
que.append(cur.right)
if cur.left:
que.append(cur.left)
res.append(resse)
return res[-1][-1]
2. 路径总和:
题目链接: 112. 路径总和 - 力扣(LeetCode)
应用条件:递归
难点:
本题和前面的所有路径很像一下就想到了,但是非常重要的一点就是在递归方法中不能直接res.append(path)。因为后面涉及到回溯,回溯会改变path数组,从而导致这里也会被改变。所以需要用path【:】创建一个path副本进行储存,这样后面path的回溯操作就不会影响到res里的结果。
个人错误:
思路:
如下
class Solution:
def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
if not root:
return False
result = []
path = []
finres = []
self.finPath(root,result,path)
for i in result:
summ = 0
for j in i:
summ = summ + j
finres.append(summ)
if targetSum in finres:
return True
else:
return False
def finPath(self, cur,res,path):
path.append(cur.val)
if cur.left == None and cur.right == None:
res.append(path[:])
if cur.left:
self.finPath(cur.left,res,path)
path.pop()
if cur.right:
self.finPath(cur.right,res,path)
path.pop()