代码随想录算法训练营第十五天 | 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和 222.完全二叉树的节点个数

110.平衡二叉树

给定一个二叉树,判断它是否是 平衡二叉树

解题

思路:判断左右孩子的高度差是否超过1,用-1表示是否是平衡二叉树。
终止条件:碰到空节点,返回高度0。
报错:当左/右子树不平衡是,直接返回-1,不用继续计算。
因为如果一个子树不平衡(即高度返回 -1),仍然继续计算另一个子树的高度,并试图计算其高度差,可能会出现比如0和-1,那可能又对了。

点击查看代码
class Solution:
    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        if self.getheight(root)==-1:
            return False
        else:
            return True 

    def getheight(self,node:Optional[TreeNode]):
        if node is None:
            return 0
        leftheight=self.getheight(node.left)
        if leftheight==-1:
                return -1
        rightheigth=self.getheight(node.right)
        if rightheigth==-1:
            return -1
        if abs(leftheight-rightheigth)>1:
            return -1
        else:
            return 1+max(leftheight,rightheigth)

257.二叉树的所有路径

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。

解题
终止条件:碰到叶子节点,判断叶子节点指当前值不为空且左右孩子为空。
关键:一个递归就要有一个回溯!
语法:map(str,path[:])列表每一项转化为字符串
报错:递归要保证节点不为空,不然中处理时候node.val会报错。

点击查看代码
class Solution:
    def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
        result=[]
        self.path(root,[],result)
        return result
    def path(self,node,path,result):   
        path.append(node.val)
        if node and not node.left and not node.right:
            result.append('->'.join(map(str,path[:])))
        if node.left:
            self.path(node.left,path,result)
            path.pop()
        if node.right:
            self.path(node.right,path,result)
            path.pop()

404.左叶子之和

给定二叉树的根节点 root ,返回所有左叶子之和。

解题

平时我们解二叉树的题目时,已经习惯了通过节点的左右孩子判断本节点的属性,而本题我们要通过节点的父节点判断本节点的属性。
左叶子:父节点A的左孩子存在,左孩子的左右孩子不存在,A的左孩子为左叶子

点击查看代码
class Solution:
    def sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        if root.left:
            if not root.left.left and not root.left.right:
                leftsum = root.left.val
            else:
                leftsum = self.sumOfLeftLeaves(root.left)
        else:
            leftsum=0
        rightsum=self.sumOfLeftLeaves(root.right)
        sum=leftsum+rightsum
        return sum

222.完全二叉树的节点个数

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

解题

跟求高度一样,就按普通二叉树求,没看完全二叉树的方法

点击查看代码
class Solution:
    def countNodes(self, root: Optional[TreeNode]) -> int:
        if root is None:
            return 0
        leftnum=self.countNodes(root.left)
        rightnum=self.countNodes(root.right)
        return leftnum+rightnum+1
posted @ 2024-06-27 20:35  Y荷兰豆Y  阅读(5)  评论(0编辑  收藏  举报