迭代法最好理解…跳过干啥…
110.平衡二叉树
平衡二叉树:左右层数相差最多为1(包括每一个节点的子树)
# 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 isBalanced(self, root: Optional[TreeNode]) -> bool:
if not root:
return True
leftdepth = self.getdepth(root.left) #左子树的高度
rightdepth = self.getdepth(root.right)
print(leftdepth)
print(rightdepth)
if leftdepth-rightdepth == -1 or leftdepth-rightdepth == 1:#比较总深度
return True
elif leftdepth-rightdepth == 0 and leftdepth != -2:#层高相等,且不等于标记符
return True
else:
return False
def getdepth(self,node):
if not node:
return 0
leftnum = self.getdepth(node.left)#获取高度
rightnum = self.getdepth(node.right)
if leftnum == -2 or rightnum == -2 or abs(leftnum - rightnum) > 1:#每层都需要比较是否为平衡二叉树
return -2#随便返回一个标记符
return max(leftnum+1,rightnum+1)#深度,+1是根节点
257. 二叉树的所有路径
第一次涉及回溯……二叉树要给人看晕了……
回溯:把已经放进去的元素依次弹出,在重新放进需要的内容,保证栈内存储的东西仅仅是此时需要输出的(记录路径)
递归每次都让我觉得不太好理解,但是有很绝妙……不熟啊不熟,还需要多练习,一看就懂,自己写根本想不到
# 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]:
if not root:
return root
path = []#当前路径
result = []#按照要求形式输出结果
self.travelsal(root,path,result)
return result
def travelsal(self,node,path,result):#输入参数:当前节点、目前的path、result
path.append(node.val)
#终止条件
if not node.left and not node.right:#没有左右节点-->到达这条路径终点(叶子结点)
Spath = '->'.join(map(str,path))#path的输出形式
result.append(Spath)#入栈
return
#可以把左子树全部遍历完
if node.left:#存在左节点
self.travelsal(node.left,path,result)
path.pop()#在递归结束后pop掉这个节点,方便下来存右节点
if node.right:#存在左节点
self.travelsal(node.right,path,result)
path.pop()#在递归结束后pop掉这个节点,方便下来存右节点
404.左叶子之和
首先理解左叶子,叶子节点是不再有子节点的节点。像下面这个二叉树,左叶子只有9+15=21
# 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:
res = self.get_leftsum(root)
return res
def get_leftsum(self,root):#输入参数
if not root:
return 0
if not root.left and not root.right:#当前节点为叶子节点,但是无法判断左右,所以不处理
return 0
#找左子树的左叶子
leftval = self.get_leftsum(root.left)
if root.left and not root.left.left and not root.left.right:#左节点存在,且为叶子节点(需要通过父节点来判断次叶子是否为左叶子)
leftval = root.left.val#取值
#找右子树的左叶子
rightval = self.get_leftsum(root.right)
leftsum = leftval+rightval
return leftsum
有难度,看代码能理解,但是自己很难写出