代码随想录算法训练营day17 | 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和

110.平衡二叉树

递归法,求高度,后序遍历

class Solution:
    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        if self.get_height(root) != -1:
            return True
        else:
            return False

    def get_height(self, node):
        if not node:
            return 0

        left_height = self.get_height(node.left)
        if left_height == -1:
            return -1
        right_height = self.get_height(node.right)
        if right_height == -1:
            return -1

        if abs(left_height-right_height) > 1:
            return -1
        else:
            return 1 + max(left_height, right_height)

257. 二叉树的所有路径

学习中

class Solution:
    def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
        res = []
        path = []
        if not root:
            return res
        self.traversal(root, res, path)
        return res

    def traversal(self, cur, res, path):
        path.append(str(cur.val))
        if not cur.left and not cur.right:
            res.append("->".join(path))
        if cur.left:
            self.traversal(cur.left, res, path)
            path.pop()
        if cur.right:
            self.traversal(cur.right, res, path)
            path.pop()

404.左叶子之和

如何能判断是左叶子?当前节点只能判断是否是叶子节点,左节点需要父节点才能判断,因此我们遍历父节点进行判断

当父节点有左节点,且左节点为叶子节点的时候统计和

递归的三要素

  • 参数为父节点,返回值为父节点以后的和
  • 终止条件:当前节点为空,返回0;当前节点为叶子节点,返回0
  • 单层逻辑:当前节点的左节点存在且为叶子节点,加上这个值;当前节点的左节点存在但不是叶子节点,继续遍历当前节点的左节点;当前节点的右节点如果存在的话,继续遍历当前节点的左节点
class Solution:
    def sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        if not root.left and not root.right:
            return 0
        result = 0
        if root.left and not root.left.left and not root.left.right:
            result += root.left.val
        elif root.left:
            result += self.sumOfLeftLeaves(root.left)
        if root.right:
            result += self.sumOfLeftLeaves(root.right)

        return result

看了题解之后,其实代码有点冗余,因为已经判断是否为空的情况了,可以直接遍历左右节点

class Solution:
    def sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        if not root.left and not root.right:
            return 0
        result = 0
        if root.left and not root.left.left and not root.left.right:
            result += root.left.val
        result += self.sumOfLeftLeaves(root.left)
        result += self.sumOfLeftLeaves(root.right)
        return result

你可能感兴趣的:(代码随想录,算法)