剑指offer0514:1、序列化二叉树;2、二叉搜索树的第k个节点;3、数据流中的中位数

1、序列化二叉树
题目描述
请实现两个函数,分别用来序列化和反序列化二叉树

笔记:不太能看到那个题目,看了评论区解析才知道 ,多做题呀~
1.序列化是指通过前序遍历把二叉树变成数组
2.反序列化是指重建二叉树
前序遍历序列化,null序列化为‘#’,index 为全局变量
链接:https://www.nowcoder.com/questionTerminal/cf7e25aa97c04cc1a68c8f040e71fb84
来源:牛客网

  1. 对于序列化:使用前序遍历,递归的将二叉树的值转化为字符,并且在每次二叉树的结点
    不为空时,在转化val所得的字符之后添加一个’ , '作为分割。对于空节点则以 ‘#’ 代替。
  2. 对于反序列化:按照前序顺序,递归的使用字符串中的字符创建一个二叉树(特别注意:
    在递归时,递归函数的参数一定要是char ** ,这样才能保证每次递归后指向字符串的指针会
    随着递归的进行而移动!!!)

解法:采用递归

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    flag = -1
    def Serialize(self, root):
        # write code here
        if not root:
            return '#'
        return str(root.val) + ',' + self.Serialize(root.left) + ',' + self.Serialize(root.right)
    def Deserialize(self, s):
        # write code here
        self.flag += 1
        l = s.split(',')
        if self.flag > len(s):
            return None
        
        root = None
        if l[self.flag] != '#':
            root = TreeNode(int(l[self.flag]))
            root.left = self.Deserialize(s)
            root.right = self.Deserialize(s)
        return root
        

2、二叉搜索树的第k个节点
题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。

笔记:
特别注意:返回的是二叉树的节点,不是节点的值!!!
二叉搜索树按照中序遍历的顺序打印出来是顺序由大到小排好的顺序,所以按照中序遍历顺序找到第k个节点就是结果。

解答:

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回对应节点TreeNode
    def KthNode(self, pRoot, k):
        # write code here
        global res
        res = []
        self.midorder(pRoot)
        if k==0 or len(res) < k:
            return None
        return res[k-1]
    def midorder(self,root):
        if not root:
            return None
        self.midorder(root.left)
        res.append(root)
        self.midorder(root.right)

解答2:

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回对应节点TreeNode
    def KthNode(self, pRoot, k):
        if pRoot==None or k==0:
            return None
        n=self.isorder(pRoot)
        if len(n)<k:
            return None
        else:
            return n[k-1]
    def isorder(self,pRoot):
        re=[]
        if not pRoot:
            return None
        if pRoot.left:
            re.extend(self.isorder(pRoot.left))
        re.append(pRoot)
        if pRoot.right:
            re.extend(self.isorder(pRoot.right))
        return re

3、数据流中的中位数

题目描述
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。

笔记:前面有题目,读取数据流中的只出现一次的字符,仿照那个,自己写的代码,第一次主要错误是提示GetMedian()变量个数,这里注意给的代码没写,应该加上自己定义的变量

解答:

# -*- coding:utf-8 -*-
class Solution:
    def __init__(self):
        self.l = []
    def Insert(self, num):
        # write code here
        self.l.append(num)
        self.l.sort()
    def GetMedian(self,l):
        # write code here
        n = len(self.l)
        if n%2 == 1:
            return self.l[int((n-1)/2)]
        if n%2 == 0:
            return (self.l[n/2] + self.l[n/2-1])/2.0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值