二叉树的类引用
在python中二叉树的构建是利用类来实现的,在此之前我们先去了解一下什么是类
贴上一篇文章的网址:http://python.jobbole.com/81921/
主要是对这篇文章的总结和整理。
用一个小例子来看一下:
class Test: def prt(self): print(self) print(self.__class__) t=Test()#类的实例化 t.prt()
执行结果:
<__main__.Test object at 0x000001A4C4FE81D0> <class '__main__.Test'>
在Python的解释器内部,当我们调用t.prt()时,实际上Python解释成Test.prt(t),也就是说把self替换成类的实例。
让我们看看不加self是什么情况
class Test:
def prt():
print(self)
t = Test()
t.prt()
结果:
----> 6 t.prt()
TypeError: prt() takes 0 positional arguments but 1 was given
简单来说,使用self,类似与先占用一个位置,之后如果类中有产生了一个实例,就可以将这个参数位置让给实例(自己的理解,不知道对不对)
lst=[1,2,3]
list.reverse(lst)
print(lst)
lst.reverse()
print(lst)
结果:
[3, 2, 1]
[1, 2, 3]
class.function(lst)等价于lst.function()
确实两种调用方法是一样的
牛客网习题总结:
1. 递归二叉树的序列打印
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class TreeToSequence:
def convert(self, root):
# write code here
shuchu=[[],[],[]]
self.xianxu(root,shuchu[0])
self.zhongxu(root,shuchu[1])
self.houxu(root,shuchu[2])
return shuchu
def xianxu(self,root,shuchu):
if root == None:
return 0
else:
shuchu.append(root.val)
self.xianxu(root.left,shuchu)
self.xianxu(root.right,shuchu)
return shuchu
def zhongxu(self,root,shuchu):
if root == None:
return 0
else:
self.zhongxu(root.left,shuchu)
shuchu.append(root.val)
self.zhongxu(root.right,shuchu)
return shuchu
def houxu(self,root,shuchu):
if root == None:
return 0
else:
self.houxu(root.left,shuchu)
self.houxu(root.right,shuchu)
shuchu.append(root.val)
return shuchu
2. 非递归二叉树的序列打印
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class TreeToSequence:
def convert(self, root):
# write code here
shuchu=[[],[],[]]
self.xianxu(root,shuchu[0])
self.zhongxu(root,shuchu[1])
self.houxu(root,shuchu[2])
return shuchu
def xianxu(self,root,res):
stack=[]
stack.append(root)
while len(stack):
cur=stack.pop()
res.append(cur.val)
if cur.right:
stack.append(cur.right)
if cur.left:
stack.append(cur.left)
return res
def zhongxu(self,root,res):
stack=[]
cur=root
while cur or len(stack):
if cur:
stack.append(cur)
cur=cur.left
else:
node=stack.pop()
res.append(node.val)
cur=node.right
return res
def houxu(self,root,res):
stack1=[]
stack2=[]
stack1.append(root)
while len(stack1):
cur = stack1.pop()
stack2.append(cur.val)
if cur.left:
stack1.append(cur.left)
if cur.right:
stack1.append(cur.right)
while len(stack2):
res.append(stack2.pop())
return res
3. 如何建立一棵二叉树&统计树中结点个数&树中所有元素之和
树结构:
class Tree:
def __init__(self,x,left=None,right=None):
self.key=x
self.left=left
self.right=right
#构建二叉树
t=Tree(2,Tree(5,Tree(8),Tree(9)),Tree(7,Tree(10),Tree(11)))
#统计数中结点个数
def count_BinTNodes(t):
if t is None:
return 0
else:
return 1+count_BinTNodes(t.left)+count_BinTNodes(t.right)
coun=count_BinTNodes(t)
print(coun)
#树中所有元素之和
def sum_BinTNodes(t):
if t is None:
return 0
else:
return t.key+sum_BinTNodes(t.left)+sum_BinTNodes(t.right)
summ=sum_BinTNodes(t)
print(summ)
结果:
7 52
4.先序遍历&先序遍历每一个元素,并且将None位置输出为#,这样才能准确的理解树的结构&加括号
#先序遍历整棵树
def preorder(t):
if t is None:
return
else:
print(str(t.key),end="")
preorder(t.left)
preorder(t.right)
#先序遍历整棵树,将None位置输出为#,这样才能准确的理解树的结构
preorder(t)
print()
def preorder2(t):
if t is None:
print('#',end="")
return
else:
print(str(t.key),end="")
preorder2(t.left)
preorder2(t.right)
preorder2(t)
print()
#先序遍历整棵树,将None位置输出为#,这样才能准确的理解树的结构,并输出为(2(5(8##)(9##))(7(10##)(11##)))
def preorder3(t):
if t is None:
print('#',end="")
return
else:
print("("+str(t.key),end="")
preorder3(t.left)
preorder3(t.right)
print(")",end="")
preorder3(t)
输出结果:
258971011 258##9##710##11## (2(5(8##)(9##))(7(10##)(11##)))
5. 序列化和反序列化(先序)
#二叉树的类引用 class Tree: def __init__(self,x,left=None,right=None): self.key=x self.left=left self.right=right #构建二叉树 root=Tree(2,Tree(5,Tree(8),Tree(9)),Tree(7,Tree(10),Tree(11))) class Solution: def Serialize(self, root): #"把对象转换为字节序列的过程称为对象的序列化" # write code here def Pre_Order(root): #先序遍历 if root: result.append(str(root.key)) #将数字转换为字符 Pre_Order(root.left) Pre_Order(root.right) else: result.append("#") result = [] Pre_Order(root) print(result) return ",".join(result) #======================================================================================= def Deserialize(self, s): #"把字节序列恢复为对象的过程称为对象的反序列化" # write code here s = s.split(",") def Change(num): num += 1 if num < len(s): if s[num] == "#": return None root = Tree(int(s[num])) root.left = Change(num) root.right = Change(num) return root else: return None num= -1 return Change(num) t=Solution() s=t.Serialize(root) print(s) #========================================== m=Solution() n=m.Deserialize(s)#利用先序序列重新构建了树 print(n)
输出结果:
['2', '5', '8', '#', '#', '9', '#', '#', '7', '10', '#', '#', '11', '#', '#'] 2,5,8,#,#,9,#,#,7,10,#,#,11,#,# <__main__.Tree object at 0x000001A4C5081748>