算法练习day17|110 平衡二叉树、257 二叉树的所有路径、404 左叶子之和

110 平衡二叉树

110 平衡二叉树

  1. 一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1(高度:从叶子节点开始往上数的最大节点数量)
  2. 如果某子树不是平衡二叉树则违反了定义,返回-1,这会使得最上层的递归也返回-1
  3. 理清二叉树深度(从某个节点往下到叶子节点) 和 二叉树高度(从叶子节点往上到某节点)的差异,求深度适合用前序遍历,而求高度适合用后序遍历。
class Solution:
    def getHeight(self, node) -> int:
        if not node:
            return 0
        leftHeight = self.getHeight(node.left)
        rightHeight = self.getHeight(node.right)
        if leftHeight == -1 or rightHeight == -1:
            return -1
        if abs(leftHeight - rightHeight) > 1:
            return -1
        height = max(leftHeight, rightHeight) + 1
        return height
    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        if self.getHeight(root) == -1:
            return False
        return True

257 二叉树的所有路径

257 二叉树的所有路径

  1. 直接用list存储path,充分体现出回溯(pop)
class Solution:
    def traversal(self, node: TreeNode, path: list, result: list) -> None:
        path.append(node.val)
        if not node.left and not node.right:
            result.append(path[:])
        if node.left:
            self.traversal(node.left, path, result)
            path.pop()
        if node.right:
            self.traversal(node.right, path, result)
            path.pop()
        
    def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
        path, result = list(), list()
        if not root:
            return result
        self.traversal(root, path, result)
        for i, ele in enumerate(result):
            result[i] = "->".join(list(map(str, ele)))
        return result
  1. 用string存储path,在传参时体现回溯(无需pop),把 path + "->"作为函数参数就是可以的,因为并没有改变path的数值,执行完递归函数之后,path依然是之前的数值(相当于回溯了)
class Solution:
    def traversal(self, node: TreeNode, path: string, result: list[string]) -> None:
        path += str(node.val)
        if not node.left and not node.right:
            result.append(path)
        if node.left:
            self.traversal(node.left, path + "->", result)
            # 回溯体现在这里传参path+"->"
            # 因为实际没改变path在这次调用traversal时的值,就不用pop了
        if node.right:
            self.traversal(node.right, path + "->", result)
        
    def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
        path, result = "", list()
        if not root:
            return result
        self.traversal(root, path, result)
        return result

404 左叶子之和

404 左叶子之和

左叶子:身为一个左孩子的叶子
因为从一个节点处不能判断自己是否为一个左孩子,所以要从父结点处判断其左孩子是否符合要求,如果找到左叶子,那么就不用往左孩子方向递归了,只往右孩子方向递归即可,如果没找到左叶子,就和以前一样左右孩子都递归下去
class Solution:
    def traversal(self, node) -> int:
        if not node:
            return 0
        if node.left and not node.left.left and not node.left.right:
            leftSum = node.left.val
            print(node.left.val)
        else:
            leftSum = self.traversal(node.left)
        rightSum = self.traversal(node.right)
        return leftSum + rightSum

    def sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
        return self.traversal(root)

你可能感兴趣的:(算法,leetcode,数据结构)