Suzy找到实习了吗Day 17 | 二叉树进行中:110. 平衡二叉树,257 二叉树的所有路径,404. 左叶子之和

110. 平衡二叉树

题目

判断一颗二叉树是否是平和二叉树:一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

我的错误trial

  1. 我通过写了一个函数(后序遍历递归法)求以一个结点为根的树的高度,然后判断根节点的左子树和右子树的高度差绝对值是否小于1。
  2. 错误原因:是每一个节点的左右两棵子树的高度差不超过1!!!

solution

学习怎么处理不满足条件的子树:根节点返回高度-1作为标记!!!

class Solution:
    def getheight(self,root)->int:
        if root==None:return 0
        else:
            h1=0
            h2=0
            if root.left: h1=self.getheight(root.left)
            if root.right: h2=self.getheight(root.right)
            # 因为使用后序遍历,所以底层的结果返回到根节点中
            # 如果根节点的左右子树的高度差绝对值大于1,则该子树不是平衡的,根节点的高度为-1
            # 否则得到根节点的高度
            if h1==-1 or h2==-1 or abs(h1-h2)>1:
                # 这里也需要注意,如果一个结点的左右结点任意一个的高度为-1,则该节点的高度也得是-1
                h=-1
            else:
                h=1+max(h1,h2)
            return h
    
    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        if self.getheight(root)==-1:
            return False
        else:
            return True

257 二叉树的所有路径

这里运用到了输出的回溯,遍历还是正常使用的是后序遍历
重要!!!!!!!!!!!!!!!!!
再次答题!!!!!!!!!!!!!!!

# 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 traversal(self,root,path,result):
        path.append(root.val)
        if root.left==None and root.right==None:
            temp=[]
            for i in path:
                temp.append(str(i))
            pathstr="->".join(temp)
            result.append(pathstr)
            return
            # 出口
        if root.left:
            self.traversal(root.left,path,result)
            path.pop()#这句话在第17行 是因为只有16行的函数return了才说明有新的路径产生(出现了子结点
        if root.right:
            self.traversal(root.right,path,result)
            path.pop()
    def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
        path=[]
        result=[]
        self.traversal(root,path,result)
        print(result)
        return result

404. 左叶子之和

聪明蛋 自己写的噢!!!

# 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:
    # 怎么定义一个节点是左叶子节点:叶子->无左右孩子,左->是父节点的左孩子
    # 判断是父节点的左孩子用direction 如果是根节点为0,往下遍历左节点-1,右节点+1
    def traversal(self,node,direction,result):
        if node.left==None and node.right==None and direction==-1:
            result.append(node.val)
            return #这里不要忘记写return
        if node.left:
            self.traversal(node.left,-1,result)
        if node.right:
            self.traversal(node.right,1,result)
            
    def sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
        result=[]
        self.traversal(root,0,result)
        print(result)
        return sum(result)

你可能感兴趣的:(python,leetcode,b树)