2022-12-25Day17 Day18

Day17

110.平衡二叉树

class Solution:
    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        if not root:
            return True
        height_map ={}
        stack = [root]
        while stack:
            node = stack.pop()
            if node:
                stack.append(node)
                stack.append(None)
                if node.left:
                    stack.append(node.left)
                if node.right:
                    stack.append(node.right)
            else:
                real_node= stack.pop()
                left,right = height_map.get(real_node.left,0),height_map.get(real_node.right,0)
                if abs(left-right)>1:
                    return False
                height_map[real_node] = 1+max(left,right)
        return True 

257. 二叉树的所有路径

class Solution:
    def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
        if not root:
            return []
        stack,res,stackpath = [root],[],[]
        stackpath.append(str(root.val))
        while stack:
            #节点和路径出栈
            node= stack.pop()
            path = stackpath.pop()
            #如果当前节点为叶子节点
            if node.left == None and node.right == None:
                res.append(path)
            #右子树入栈
            if node.right:
                stack.append(node.right)
                stackpath.append(path+'->'+str(node.right.val))
            #左子树入栈
            if node.left:
                stack.append(node.left)
                stackpath.append(path +'->'+str(node.left.val))
        return res 

404. 左叶子之和

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

Day18

513.找树左下角的值

class Solution:
    def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 
        stack = deque([root])
        res = 0 
        while stack:
            n = len(stack)
            res = stack[0].val 
            for _ in range(n):
                node = stack.popleft()
                if node.left:
                    stack.append(node.left)
                if node.right:
                    stack.append(node.right)
        return res 

112. 路径总和

class Solution:
    def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:
        if not root:
            return False
        que = collections.deque()
        que.append((root, root.val))
        while que:
            node, path = que.popleft()
            if not node.left and not node.right and path == targetSum:
                return True
            if node.left:
                que.append((node.left, path + node.left.val))
            if node.right:
                que.append((node.right, path + node.right.val))
        return False

106. 从中序与后序遍历序列构造二叉树

class Solution:
    def buildTree(self, inorder: List[int], postorder: List[int]) -> Optional[TreeNode]:
        if not postorder:
            return None
        #第一步 后序遍历的最后一个节点就是根节点
        root_val = postorder[-1] 
        root = TreeNode(root_val)
        #第二步 找切割点
        separet_idx = inorder.index(root_val)

        #第三步 切割inorder数组,
        inorder_left = inorder[:separet_idx]
        inorder_right = inorder[separet_idx+1:]

        #第四步 切割postorder数组
        postorder_left = postorder[:len(inorder_left)]
        postorder_right = postorder[len(inorder_left):len(postorder)-1]
        #第五步 递归
        root.left = self.buildTree(inorder_left,postorder_left)
        root.right = self.buildTree(inorder_right,postorder_right)

        return root 
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 点赞关注,不再迷路,你的支持对我意义重大!🔥 Hi,我是丑丑。本文「数据结构 & 算法」| 导读 —— 登高博见[...
    彭旭锐阅读 7,349评论 0 15
  • 1,二叉树 每个结点最多有两个子树的树结构 2,满二叉树 如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0...
    liang1030阅读 3,138评论 0 0
  • 二叉树(dfs、bfs) 主要掌握前序、中序、后续、层序、广度、深度的几种遍历方式。其中,涉及到二叉搜索树的,多需...
    cqf阅读 981评论 0 0
  • 算法思想贪心思想双指针排序快速选择堆排序桶排序荷兰国旗问题二分查找搜索BFSDFSBacktracking分治动态...
    第六象限阅读 10,076评论 0 0
  • https://leetcode-cn.com/problems/minimum-depth-of-binary-...
    Eden0503阅读 1,638评论 0 0