1、序列化二叉树
题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
笔记:不太能看到那个题目,看了评论区解析才知道 ,多做题呀~
1.序列化是指通过前序遍历把二叉树变成数组
2.反序列化是指重建二叉树
前序遍历序列化,null序列化为‘#’,index 为全局变量
链接:https://www.nowcoder.com/questionTerminal/cf7e25aa97c04cc1a68c8f040e71fb84
来源:牛客网
- 对于序列化:使用前序遍历,递归的将二叉树的值转化为字符,并且在每次二叉树的结点
不为空时,在转化val所得的字符之后添加一个’ , '作为分割。对于空节点则以 ‘#’ 代替。 - 对于反序列化:按照前序顺序,递归的使用字符串中的字符创建一个二叉树(特别注意:
在递归时,递归函数的参数一定要是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