leetcode 919. 完全二叉树插入器 - python 递归解法

二次元码农
• 阅读 1608

解题思路

需要维护树的节点数、高度。

树的高度 h = math.floor(math.log(节点数,2)+1)

每次插入的时候:

  1. 计算当前的叶子节点数(leaf_cnt = int(cnt - 2 ** (h-1)+1)),当前最后一层叶子节点最多有多少(full_leaf_cnt = int(2 ** (h-1))

    1. 如果当前叶子节点数是 0 到 最大数//2,或者是叶子节点满了递归到左子树
    2. 如果不是递归到右子树

递归的退出条件是:子树的节点数 == 1 直接插入当前节点的左孩子,节点数 == 2 插入为右孩子。

代码

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class CBTInserter:

    def __init__(self, root: TreeNode):
        self.root = root
        self.cnt = 0
        self.get_cnt(root)
        self.h = math.floor(math.log(self.cnt,2)+1)

    def get_cnt(self, root):
        if root:
            self.cnt += 1
            self.get_cnt(root.left)
            self.get_cnt(root.right)
        

    def insert(self, v: int) -> int:
        if self.cnt == 0:
            self.root = TreeNode(v)
        else:
            return self.do_insert(v, self.cnt, self.h, self.root)

    def do_insert(self, v, cnt, h, r):
        if cnt == 1:
            r.left = TreeNode(v)
            self.cnt += 1
            self.h = math.floor(math.log(self.cnt,2)+1)
            return r.val
        elif cnt == 2:
            r.right = TreeNode(v)
            self.cnt += 1
            self.h = math.floor(math.log(self.cnt,2)+1)
            return r.val
        else:
            leaf_cnt = int(cnt - 2 ** (h-1)+1) # 当前的叶子节点数
            full_leaf_cnt = int(2 ** (h-1))    # 最后一层叶子节点最多有多少
            if leaf_cnt == full_leaf_cnt:
                return self.do_insert(v, 2**(h-1)-1, h-1, r.left)
            elif leaf_cnt < full_leaf_cnt>>1:
                return self.do_insert(v, 2**(h-2)-1+leaf_cnt, h-1, r.left)
            else:
                return self.do_insert(v, 2**(h-2)-1+leaf_cnt-(full_leaf_cnt>>1), h-1, r.right)

    def get_root(self) -> TreeNode:
        return self.root


# Your CBTInserter object will be instantiated and called as such:
# obj = CBTInserter(root)
# param_1 = obj.insert(v)
# param_2 = obj.get_root()

另一种解法:
建立一个双向队列,队列里只放孩子不满的的节点。
当一个节点的右孩子插入以后就把它出队。

https://leetcode-cn.com/probl...


欢迎来我的博客: https://codeplot.top/
我的博客刷题分类:https://codeplot.top/categories/%E5%88%B7%E9%A2%98/

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Easter79 Easter79
4年前
typeScript数据类型
//布尔类型letisDone:booleanfalse;//数字类型所有数字都是浮点数numberletdecLiteral:number6;lethexLiteral:number0xf00d;letbinaryLiteral:number0b101
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
4年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Stella981 Stella981
4年前
LeetCode(110):平衡二叉树
Easy!题目描述:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树_每个节点_的左右两个子树的高度差的绝对值不超过1。示例1:给定二叉树 3,9,20,null,null,15,73/\920/
Wesley13 Wesley13
4年前
C语言递归之二叉树的最小深度
https://www.cnblogs.com/shichampion/p/12262678.html题目描述给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节点的节点。示例输入:3,9,20,null,null,15,7
Stella981 Stella981
4年前
LeetCode112
非商业,LeetCode链接附上:https://leetcodecn.com/problems/pathsum/进入正题。题目:给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明: 叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和
Wesley13 Wesley13
4年前
MongoDB 的分片技术
   在MongoDB中分片技术也就是集群。需要1台配置服务器配置各个节点的配置信息,1台路由服务器来知道每一台节点都在哪个地方并给用户提供各个节点数据的访问功能,还有多台节点服务器,存储节点数据。   当前我有三台机器192.168.0.114,192.168.0.115,192.168.0.116,规划如下:  搭建配置服务器:192.1
深入理解左倾红黑树 | 京东物流技术团队
平衡二叉搜索树平衡二叉搜索树(BalancedBinarySearchTree)的每个节点的左右子树高度差不超过1,它可以在O(logn)时间复杂度内完成插入、查找和删除操作,最早被提出的自平衡二叉搜索树是AVL树。AVL树在执行插入或删除操作后,会根据节