110.平衡二叉树
- 后序遍历,因为需要左右节点将节点信息返回給父节点,所以应该是左右中的顺序,为后序遍历。
- 在函数体中需要将result的判断条件加进去,一同将数值返回给上一层的结点。
class Solution:
def isBalanced(self, root: Optional[TreeNode]) -> bool:
# 后序遍历返回每个孩子的高度
if not root:
return True
# 返回树的高度
# 重点是如何记录不符合条件的字数,利用-1进行记录,对不符合要求的字数记录为-1当成叶子节点的值,然后返回即可
result = 0
def getHeight(node):
if not node:
return 0
leftHeight = getHeight(node.left)
if leftHeight == -1: return -1
rightHeight = getHeight(node.right)
if rightHeight == -1: return -1
if abs(leftHeight-rightHeight) > 1 :
result = -1
else:
result = max(leftHeight,rightHeight) + 1
return result
if getHeight(root) == -1:
return False
else:
return True
257.二叉树的所有路径
思路:利用前序(中左右),为什么需要使用前序呢?因为只有在使用前序的情况下,才能够记录这个节点后续的路径。
收集路径的过程就是回溯的过程,在回溯的过程的基础上将path一步一步弹出即可。
反思: traversal函数中,判断方式是如果当前路径走到头,那么此时应该将该path进行返回;一定要注意在递归方式中一次递归只考虑当前函数即可。
class Solution:
def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
# 递归的方式,前序遍历
path = ''
result = []
if not root :
return result
# 相当于在这其中加入了一个递归函数
def traversal(root,path,result):
# 按照中左右的顺序进行遍历
path += str(cur.val)
if not cur.left and not cur.right:
result.append(path)
if cur.left:
traversal(cur.left,path+'->',result)
if cur.right:
traversal(cur.right,path+'->',result)
return result
404.左叶子之和
关键点:如何判断该结点是左叶子
class Solution:
def sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
value = 0
result = []
# 前中后序
def traversal(node):
# 判断当前节点是否为子树,把满足这种形式的节点保存下来
if node.left and not node.left.left and not node.left.right:
result.append(node.left.val)
if node.left:
leftresult = traversal(node.left)
if node.right:
rightresult = traversal(node.right)
traversal(root)
return sum(result)