我们在第5章的时候就已经讲过树的基本概念了。忘记了的记得去回顾,现在我们使用树来进行应用。
我们将使用树来制作一个模拟文件系统。
代码如下:
class Node(): # 建立树的节点
def __init__(self,name,type='dir'):
self.name = name
self.type = type
self.children = []
self.parent = None
def __repr__(self):
return self.name
class FileSystemTree:
def __init__(self):
self.root = Node('/') # 建立根节点
self.now = self.root
def mkdir(self,name): # 创建文件夹
if name[-1] != "/":
name += '/'
node = Node(name)
self.now.children.append(node)
node.parent = self.now
def ls(self): # 展示当前目录下的子列表
return self.now.children
def cd(self,name): # 切换目录
if name[-1] != "/":
name += "/"
if name == "../":
self.now = self.now.parent
return
for child in self.now.children:
if child.name == name:
self.now = child
return
raise ValueError('invalid dir')
# 主函数tree = FileSystemTree()
tree.mkdir('var/')
tree.mkdir('bin/')
print(tree.ls())
tree.cd("var/")
tree.mkdir('x64')
print(tree.ls())
通过上面的代码,可以发现主要就是节点(node)的设置需要熟悉,其他就是正常逻辑性的代码。
二叉树的链式存储:将二叉树的节点定义为一个对象,节点之间通过类似链表的链接方法来连接。
二叉树的节点稍微有点改变,代码如下:
class BiTreeNode():
def __init__(self,data):
self.data = data
self.lchild = None # 左孩子
self.rchild = None # 右孩子
# 主函数
a = BiTreeNode("A")
b = BiTreeNode("B")
c = BiTreeNode("C")
d = BiTreeNode("D")
e = BiTreeNode("E")
f = BiTreeNode("F")
g = BiTreeNode("G")
c.lchild = a
c.rchild = b
a.lchild = e
a.rchild = f
b.rchild = d
f.lchild = g
root = c
print(root.lchild.rchild.data)
流程图如下:
二叉树的遍历方式为:前序遍历、中序遍历、后序遍历、层次遍历;在上面的二叉树代码的基础上,我们使用不同的遍历方式来观察不同遍历的输出
前序遍历是先输出根节点,再递归访问左子树,再递归访问右子树。
代码如下:
# 前序遍历
def pre_order(root):
if root:
print(root.data,end=',')
pre_order(root.lchild)
pre_order(root.rchild)
pre_order(root)
print('\n')
# 输出
C,A,E,F,G,B,D,
先递归访问左子树,再访问根节点,再递归访问右子树。
代码如下:
# 中序遍历
def in_order(root):
if root:
in_order(root.lchild)
print(root.data,end=',')
in_order(root.rchild)
in_order(root)
print('\n')
# 输出
E,A,G,F,C,B,D,
# 后序遍历
def post_order(root):
if root:
post_order(root.lchild)
post_order(root.rchild)
print(root.data,end=',')
post_order(root)
print('\n')
# 输出
E,G,F,A,D,B,C,
通过队列的形式,让二叉树从根节点自上而下,自左而右的进行遍历。
# 层次遍历
def level_order(root):
queue = deque()
queue.append(root) # 将根节点放到队列之中
while len(queue) > 0: # 只要队列不空
node = queue.popleft() # 队头出队
print(node.data,end=',')
if node.lchild: # 出队的节点存在左孩子,就把左孩子入队
queue.append(node.lchild)
if node.rchild: # 如果存在右孩子,就把右孩子入队
queue.append(node.rchild)
level_order(root)
# 输出
C,A,B,E,F,D,G,