513. 找树左下角的值
找树左下角的值
这题使用层序遍历比较简单,但是好久没写层序遍历了,有几个注意先。
1.size 需要在 que 的后面。
2. res 在 for 的前面。
class Solution:
def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:
if not root:
return []
result=[]
from collections import deque
que=deque([root])
while que:
size=len(que)
res=[]
for _ in range(size):
cur=que.popleft()
res.append(cur.val)
if cur.left:
que.append(cur.left)
if cur.right:
que.append(cur.right)
result.append(res)
return result[-1][0]
112. 路径总和
路径总和
本题使用递归的方法,其中的原理还需要仔细考虑。
class Solution:
def hasPathSum(self, root: Optional[TreeNode], target: int) -> bool:
def traveral(root,target):
if (not root.left) and (not root.right) and target==0:
return True
if (not root.left) and (not root.right):
return False
if root.left:
target-=root.left.val
if traveral(root.left,target):return True
target+=root.left.val
if root.right:
target-=root.right.val
if traveral(root.right,target):return True
target+=root.right.val
return False
if root==None:
return False
else:
return traveral(root,target-root.val)
根据所有路径改编
这个涉及到浅拷贝与深拷贝的问题。字符串是不可变的,见链接:浅拷贝与深拷贝
class Solution:
def hasPathSum(self, root: Optional[TreeNode], target: int) -> bool:
path = []
result = []
if not root: return False
self.traveral(root, path, result)
for i in result:
if sum(i)==target:
return True
return False
def traveral(self, cur, path, result):
path.append( cur.val)
if not cur.left and not cur.right:
result.append(path)
if cur.left:
self.traveral(cur.left, path[:] , result)
if cur.right:
self.traveral(cur.right, path[:] , result)
106. 从中序与后序遍历序列构造二叉树
题目链接:从中序与后序遍历序列构造二叉树
这题分为六个步骤:
- 处理特殊情况
- 后序遍历的最后一个就是当前的中间节点
- 寻找切割点
- 切割inorder数组. 得到inorder数组的左,右半边.
- 切割inorder数组. 得到inorder数组的左,右半边.
- 第六步: 递归
class Solution:
def buildTree(self, inorder, postorder) :
if not postorder:
return
# 后序遍历的最后一个就是当前的中间节点
root_val=postorder[-1]
root=TreeNode(root_val)
# 寻找切割点
root_index=inorder.index(root_val)
#切割inorder数组. 得到inorder数组的左,右半边.
left_inorder=inorder[:root_index]
right_inorder=inorder[root_index+1:]
#切割inorder数组. 得到inorder数组的左,右半边.
left_postorder=postorder[:len(left_inorder)]
right_postorder=postorder[len(left_inorder):len(postorder)-1]
# 第六步: 递归
root.left = self.buildTree(left_inorder, left_postorder)
root.right = self.buildTree(right_inorder, right_postorder)
return root