16、python数据结构——二叉树的遍历

我们在第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)

流程图如下:
16、python数据结构——二叉树的遍历_第1张图片
二叉树的遍历方式为:前序遍历、中序遍历、后序遍历、层次遍历;在上面的二叉树代码的基础上,我们使用不同的遍历方式来观察不同遍历的输出

前序遍历

前序遍历是先输出根节点,再递归访问左子树,再递归访问右子树。
16、python数据结构——二叉树的遍历_第2张图片
代码如下:

# 前序遍历
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,

中序遍历

先递归访问左子树,再访问根节点,再递归访问右子树。
16、python数据结构——二叉树的遍历_第3张图片
代码如下:

# 中序遍历
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,

后序遍历

先递归访问左子树,再递归访问右子树,再访问根。
16、python数据结构——二叉树的遍历_第4张图片

# 后序遍历
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,

层次遍历

通过队列的形式,让二叉树从根节点自上而下,自左而右的进行遍历。
16、python数据结构——二叉树的遍历_第5张图片

# 层次遍历
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,

你可能感兴趣的:(python数据结构,python,数据结构,开发语言)