平衡二叉树
1.题目
给定一个二叉树,判断它是否是高度平衡的二叉树。
平衡二叉树
tips:如果不会做建议先去刷二叉树的最大深度
2.实现
# 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 __init__(self):
self.res = True
def heighttree(self, root):
if not root:
return 0
ldepth = self.heighttree(root.left)
rdepth = self.heighttree(root.right)
if abs(ldepth - rdepth) > 1:
self.res = False
return max(ldepth, rdepth) + 1
def isBalanced(self, root: Optional[TreeNode]) -> bool:
# 求高度用后序遍历,去比较返回的左右子树的高度差
# 这里可以提前剪枝将结果res变成-1从而快速结束递归
if not root:
return True
self.heighttree(root)
return self.res
3.文章讲解
写法可以很多种,但是要注意遍历顺序以及单层逻辑
二叉树的所有路径
1.题目
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点。
2.复习前
1)犹豫了遍历顺序,实践出真知!
2)python中的值传递(针对不可变数据类型,number/string/tuple)和引用传递(针对可变数据类型,list/map/set)python返回值的类型,注意这里如果是用数组的话如何回溯记录路径!
# 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 __init__(self):
self.res = []
def treepath(self, root, tmp):
if not root:
return
tmp.append(str(root.val))
if not root.left and not root.right:
if len(tmp) == 1:
self.res.append(tmp)
else:
self.res.append("->".join(tmp))
if root.left:
self.treepath(root.left, tmp)
tmp.pop()
if root.right:
self.treepath(root.right, tmp)
tmp.pop()
def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
# 采用前序遍历,到叶子节点时加入数组res;每条路径用字符串记录不用数组会写起来方便点
# 数组为可变元素,所以需要做pop处理即回溯操作,而字符串可以以参数形式传递中间用+连接,而不改变当前root记录的字符串
tmp = []
if not root.left and not root.right:
return [str(root.val)]
self.treepath(root, tmp)
return self.res
3.文章讲解
尝试用string记录path,重刷!
左叶子之和
1.题目
给定二叉树的根节点 root ,返回所有左叶子之和。
左叶子之和
注意:左叶子也是叶子节点,只不过是满足root.left
2.实现
复习前:
对于如何去求和并作为返回值返回的情况写不对,不能写:
return root.left.val 而是应该返回给lres
# 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 __init__(self):
self.res = 0
def sumleft(self, root):
if not root:
return
left = root.left
if left:
if not left.left and not left.right:
self.res += root.left.val
self.sumleft(root.left)
self.sumleft(root.right)
def sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
# self.sumleft(root)
# return self.res
if not root:
return 0
lres = self.sumOfLeftLeaves(root.left)
if root.left:
if not root.left.left and not root.left.right:
lres += root.left.val
rres = self.sumOfLeftLeaves(root.right)
return lres + rres
3.文章讲解
注意:对于不清楚单层逻辑的题目,建议对left和right分别取变量名,进行运算或返回,以便弄清楚处理顺序