首页 > 其他分享 >leetcode -- tree 2

leetcode -- tree 2

时间:2022-09-29 14:46:27浏览次数:42  
标签:node index TreeNode preorder -- self tree root leetcode

  1. 最大二叉树
递归构造
class Solution:
    def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]: 
        if not nums:
            return None
        m_index = nums.index(max(nums))
        root = TreeNode(nums[m_index])
        root.left = self.constructMaximumBinaryTree(nums[:m_index])
        root.right = self.constructMaximumBinaryTree(nums[m_index + 1 :])
        return root
  1. 从前序与中序遍历序列构造二叉树
递归 + 迭代
# 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 buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        if not preorder:
            return None

        # 首先创建一个栈 载入前序序列的第一个节点
        root = TreeNode(preorder[0])
        inorderindex = 0
        stack = [root]

        # 整体遍历前序遍历的数组
        for i in range(1, len(preorder)):
            p_val = preorder[i]
            node = stack[-1]


            if node.val != inorder[inorderindex]:
                node.left = TreeNode(val=p_val)
                stack.append(node.left)
            else:
                while stack and stack[-1].val == inorder[inorderindex]:
                    node = stack.pop()
                    inorderindex += 1
                node.right = TreeNode(val=p_val)
                stack.append(node.right)

        return root
# 递归写法
class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        if not preorder:
            return None
        
        index = inorder.index(preorder[0])
        root = TreeNode(preorder[0])
        root.left = self.buildTree(preorder[1: index + 1], inorder[0: index])
        root.right = self.buildTree(preorder[index + 1:], inorder[index + 1:])
        return root
  1. 从中序与后序遍历序列构造二叉树
递归 + 迭代
# 递归
class Solution:
    def buildTree(self, inorder: List[int], postorder: List[int]) -> Optional[TreeNode]:
        if inorder == [] or postorder == []:
            return 
        index = inorder.index(postorder[-1])
        root = TreeNode(postorder[-1],
                        self.buildTree(inorder[:index], postorder[:index]),
                        self.buildTree(inorder[index + 1:], postorder[index:-1]))
        return root

# 迭代
class Solution:
    def buildTree(self, inorder: List[int], postorder: List[int]) -> Optional[TreeNode]:
        if not postorder:
            return None

        root = TreeNode(postorder[-1])
        stack = [root]
        i_inorder = -1

        for i in range(1, len(postorder)):
            p_val = postorder[-1 - i]
            node = stack[-1]

            if node.val != inorder[i_inorder]:
                node.right = TreeNode(p_val)
                stack.append(node.right)
            else:
                while stack and stack[-1].val == inorder[i_inorder]:
                    i_inorder -= 1
                    node = stack.pop()
                node.left = TreeNode(p_val)
                stack.append(node.left)
        
        return root
  1. 根据前序和后序遍历构造二叉树
递归
class Solution:
    def constructFromPrePost(self, preorder: List[int], postorder: List[int]) -> Optional[TreeNode]:
        if not preorder:
            return None
        elif len(preorder) == 1:
            return TreeNode(preorder[0])
        
        root = TreeNode(preorder[0])
        if preorder[1] == postorder[-2]:
            root.left = self.constructFromPrePost(preorder[1:], postorder[:-1])
        else:
            post_index = postorder.index(preorder[1])
            pre_index = preorder.index(postorder[-2])

            root.left = self.constructFromPrePost(preorder[1: pre_index],postorder[:post_index + 1])
            root.right = self.constructFromPrePost(preorder[pre_index:],postorder[post_index + 1:-1]) 
        return root
  1. 二叉树序列化与反序列化
先序遍历 + 层序遍历

class Codec:

    def serialize(self, root):
        # Encodes a tree to a single string.
        def dfs(node):
            if not node:
                res.append('None')
            else:
                res.append(str(node.val))
                dfs(node.left)
                dfs(node.right)
            
        res = []
        dfs(root)
        return '[' + ','.join(res) + ']'

    def deserialize(self, data):
        # Decodes your encoded data to tree.
        def dfs():
            v = next(i)
            if v == 'None':
                return None
            node = TreeNode(int(v))
            node.left = dfs()
            node.right = dfs()
            return node
        i = iter(data[1:-1].split(','))
        return dfs()

# 层序遍历

class Codec:
    from collections import deque

    def serialize(self, root):
        # Encodes a tree to a single string.
        if not root:
            return '[]'
        res = []
        tmp = deque([root])    
        while tmp:
            node = tmp.popleft()
            if not node:
                res.append('None')
            else:
                res.append(str(node.val))
                tmp.append(node.left)
                tmp.append(node.right)

        return '[' + ','.join(res) + ']'

    def deserialize(self, data):
        # Decodes your encoded data to tree.
        if data == '[]':
            return None
        i, v = 1, data[1:-1].split(',')
        root = TreeNode(int(v[0]))
        tmp = deque([root])
        while tmp:
            node = tmp.popleft()
            if v[i] != 'None':
                node.left = TreeNode(int(v[i]))
                tmp.append(node.left)
            
            i += 1
            if v[i] != 'None':
                node.right = TreeNode(int(v[i]))
                tmp.append(node.right)
            i += 1

        return root

标签:node,index,TreeNode,preorder,--,self,tree,root,leetcode
From: https://www.cnblogs.com/DocGu/p/16741486.html

相关文章

  • 7. HTML-- 文本格式化
    1.前言一些HTML标签除了具有一定的语义(含义)外,还有默认的样式,例如<b>(加粗)、<em>(倾斜)等,通过这些标签我们无需借助CSS就可以为网页中的内容定义样式。在这些具有语义和......
  • 13 刘欣晨 2022.9.22
    实验一 项目名称:     输出每日一贴                       importdatetimemot=["今天星期一:\n坚持下去不是因为我很坚强,而是因为我别......
  • minio通过docker方式部署
    MinIO是在GNUAffero通用公共许可证v3.0下发布的高性能对象存储。它是与AmazonS3云存储服务兼容的API官方文档http://docs.minio.org.cn/docs/master/minio-adm......
  • 马踏棋盘算法
    应用实例马踏棋盘算法也被称为骑士周游问题将马随机放在国际象棋的8×8棋盘Board[0~7][0~7]的某个方格中,马按走棋规则(马走日字)进行移动。要求每个方格只进入一次,走遍棋......
  • Vscode中点击自动eslint格式化和prettier搭配
    eslint规则只是限制我们在写代码时候的标准化,尤其是在团队开发中成员的代码一致性,如果大家都是自己的标准,那么写出的项目将没有办法进行阅读,不利于后期的二次开发vscode自......
  • SVN、Git、Github、Gitee、Gitlab 之间的关系
    SVN是一个集中式版本控制系统。仓库:中央服务器(远程仓库)。Git是一个分布式版本控制系统。仓库:中央服务器(远程仓库),个人电脑(本地仓库)。GithubGithub是基于git的代......
  • docker 使用
      dockerpull下来的镜像都存到了哪里dockerpull下来的命令都默认存在/var/lib/docker/文件夹下。查看/var/lib/docker/image/overlay2/repositories.json文件:正......
  • CH573F蓝牙从机(peripheral)例程讲解(二)
    在上一篇外设例程讲解中讲述了蓝牙从机的收发接口,这样可以快速的上手,那么接下来就讲解另一个重要设置,从机的广播。在peripheral例程中,一直是以50ms的周期进行广播,使用手机......
  • 驱动开发:内核中的自旋锁结构
    提到自旋锁那就必须要说链表,在上一篇《驱动开发:内核中的链表与结构体》文章中简单实用链表结构来存储进程信息列表,相信读者应该已经理解了内核链表的基本使用,本篇文章将讲解......
  • Appium PO模式UI自动化测试框架——设计与实践
      (阅读目录)  1.目的  相信做过测试的同学都听说过自动化测试,而UI自动化无论何时对测试来说都是比较吸引人的存在。相较于接口自动化来说它可以最大程度的模......