110.平衡二叉树
为什么104.二叉树的最大深度 中求的是二叉树的最大深度,也用的是后序遍历
那是因为代码的逻辑其实是求的根节点的高度,而根节点的高度就是这棵树的最大深度,所以才可以使用后序遍历
class Solution:
def isBalanced(self, root: Optional[TreeNode]) -> bool:
def height(root):
if root is None:
return 0
left_height = height(root.left)
right_height = height(root.right)
if left_height == -1 or right_height == -1 or abs(left_height - right_height) > 1:
return -1
return 1 + max(left_height, right_height)
return height(root) != -1
257. 二叉树的所有路径
回溯
操作 -> traverse -> 撤销
class Solution:
def traverse(self, cur, res, path):
path.append(cur.val)
if not cur.left and not cur.right:
sPath = '->'.join(map(str, path))
res.append(sPath)
return
if cur.left:
self.traverse(cur.left, res, path)
path.pop()
if cur.right:
self.traverse(cur.right, res, path)
path.pop()
def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
res = []
path = []
if not root:
return result
self.traverse(root, res, path)
return res
新操作
sPath = '->'.join(map(str, path))
404.左叶子之和
判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子
如果遍历到空节点,那么左叶子值一定是0
if (root == NULL) return 0;
注意,只有当前遍历的节点是父节点,才能判断其子节点是不是左叶子。 所以如果当前遍历的节点是叶子节点,那其左叶子也必定是0,那么终止条件为
if (root == NULL) return 0;
if (root->left == NULL && root->right== NULL) return 0; //其实这个也可以不写,如果不写不影响结果,但就会让递归多进行了一层。
当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。
class Solution:
def sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
if root is None:
return 0
if root.left is None and root.right is None:
return 0
leftValue = self.sumOfLeftLeaves(root.left) # 左
if root.left and not root.left.left and not root.left.right: # 左子树是左叶子的情况
leftValue = root.left.val
rightValue = self.sumOfLeftLeaves(root.right) # 右
# if root.left and not root.left.left and not root.left.right: # 左子树是左叶子的情况
# leftValue = root.left.val
sum_val = leftValue + rightValue # 中
return sum_val