力扣hot100_二叉树(4)_python版本

一、199. 二叉树的右视图

  • 思路:
    直接复用层序遍历的代码,然后取每层的最后一个节点
  • 代码:
python 复制代码
class Solution:
    def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
        '''
        层序遍历取每层的第一个
        '''
        if not root: return []

        res = []
        queue = collections.deque()
        queue.append(root)
        while queue:
            tmp_res = []
            for _ in range(len(queue)):
                node = queue.popleft()
                tmp_res.append(node.val)
                if node.left:queue.append(node.left)
                if node.right:queue.append(node.right)
            res.append(tmp_res[-1])  # 只需要修改层序遍历的这里
        return res

二、114. 二叉树展开为链表

  • 思路:
    直接复用先序遍历,然后遍历结果,依次修改结果就行
  • 代码:
python 复制代码
class Solution:
    def flatten(self, root: Optional[TreeNode]) -> None:
        """
        Do not return anything, modify root in-place instead.
        可以先序遍历节点,将节点放到列表中,然后连接上各节点
        """
        def dfs(cur):
            if not cur:
                return
            res.append(cur)
            dfs(cur.left)
            dfs(cur.right)
        res = []
        dfs(root)
        for idx, n in enumerate(res):
            if idx == len(res)-1:  
                n.left = None
                n.right = None
            else:
                n.left = None
                n.right = res[idx+1]

三、105. 从前序与中序遍历序列构造二叉树

  • 思路:
    根据前中后序任意两个可以重建一颗二叉树,只靠前序和后序不是唯一的。
  • 代码:
python 复制代码
class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
        if not preorder:  # 空节点
            return None
        left_size = inorder.index(preorder[0])  # 左子树的大小
        left = self.buildTree(preorder[1: 1 + left_size], inorder[:left_size])
        right = self.buildTree(preorder[1 + left_size:], inorder[1 + left_size:])
        return TreeNode(preorder[0], left, right)

四、889. 根据前序和后序遍历构造二叉树

  • 代码:
python 复制代码
class Solution:
    def constructFromPrePost(self, preorder: List[int], postorder: List[int]) -> Optional[TreeNode]:
        if not preorder:  # 空节点
            return None
        if len(preorder) == 1:  # 叶子节点
            return TreeNode(preorder[0])
        left_size = postorder.index(preorder[1]) + 1  # 左子树的大小
        left = self.constructFromPrePost(preorder[1: 1 + left_size], postorder[:left_size])
        right = self.constructFromPrePost(preorder[1 + left_size:], postorder[left_size: -1])
        return TreeNode(preorder[0], left, right)
相关推荐
熊猫钓鱼>_>几秒前
四种书签,一条时间线:一个读书 App 的记忆颗粒与它的边界案例【鸿蒙心迹】
开发语言·华为·ai编程·harmonyos·鸿蒙·openharmony·鸿蒙pc
Fuyo_111925 分钟前
C++ AVL树保姆级详解:从平衡因子到四大旋转机制
java·c++·算法
努力努力再努力wz36 分钟前
【Lua 入门系列】Lua 函数深入理解:函数对象、多返回值、可变参数、闭包、递归与尾调用优化
开发语言·lua
Patrick在香港39 分钟前
一个斜杠,把毫秒变成十几秒
android·数据库·python·性能优化·正则表达式·回溯·redos
jktantan1 小时前
每个节点 41 字节:把一棵百万节点树拆进 14 个 typed array
前端·javascript·vue.js·算法·typescript
2601_967980111 小时前
Python 初学者必备的常用内置函数
python·编程语言·内置函数·初学者·常用函数
OnlineProxy1 小时前
移动应用数据爬取:通过模拟器与流量嗅探对 API 进行逆向工程
爬虫·python·httpx
揽星河..1 小时前
【C语言】猜数字游戏
c语言·算法·游戏
染指11101 小时前
162.Agent-LangGraph-检查点的作用
人工智能·python·langchain·agents
飞浪纪元[FWC–FE]1 小时前
从零到一键绿:Qt 5.14.2 + VS2019 开发环境搭建、Kit 套件配置与构建错误修复完全手册
开发语言·qt