IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> python实现二叉树的创建、前序遍历、中序遍历以及层次遍历 -> 正文阅读

[数据结构与算法]python实现二叉树的创建、前序遍历、中序遍历以及层次遍历

二叉树的概念

二叉树是指度不超过2的树,可以由n个结点构成,如下图。
在这里插入图片描述

二叉树的创建

注意:输入的格式,如下图,D结点的孩子结点,空结点用#代替,直到最后一层就可以停止输入,以下面这棵树为例,则我们的输入为 ABCDE#F##G#####

在这里插入图片描述

class BiTreeNode:
    def __init__(self, data):
        self.data = data
        self.lchild = None
        self.rchild = None


class CreateBiTree:
    """
    str_tree: 传入字符串
    return: 返回根结点
    """
    def __init__(self, str_tree):
        self.str_tree = str_tree

    def create_tree(self):
        l1 = list(self.str_tree)
        l1 = [None if i == '#' else i for i in l1] # 将#转为None
        nodes = [BiTreeNode(l1[i]) for i in range(len(l1))] # 初始化各个结点
        root = nodes[0]
        for i in range(len(l1)):
            if 2*i+2 > len(l1): # 循环到最后的右孩子结束
                break
            cur_node = nodes[i]
            if nodes[2*i+1].data:
                cur_node.lchild = nodes[2*i+1] # 当前结点的左孩子
            if nodes[2*i+2].data:
                cur_node.rchild = nodes[2*i+2] # 当前结点的右孩子
        return root
    def __call__(self):
        return self.create_tree()
a = CreateBiTree('ABCDE#F##G#####')
root = a() # 调用__call__方法
print('根结点为:', root.data)

二叉树的遍历

前序遍历

前序遍历指先访问根结点,再访问该结点的左孩子和右孩子。继续以这棵树为例。

在这里插入图片描述
第一步,访问根结点A,然后是B、D、E、G这棵左子树和C、F右子树。
第二步,访问B、D、E、G子树的根结点B,然后是D这棵左子树和E、G这棵右子树。
第三步,访问D左子树根结点。没有子树则无需访问。
第四步,访问E、G这棵右子树的根结点E,然后是左子树G。
第五步,访问左子树G的根结点G。
第六部,访问C、F右子树的根结点C,然后是F右子树。
第七步,访问F右子树的根结点F。

def pre_order(root):
    # 前序排列
    if root:
        print(root.data, end=',')
        pre_order(root.lchild)
        pre_order(root.rchild)

中序遍历

中序排列是先访问左子树,再访问根结点,然后是右子树。以上个树为例。
在这里插入图片描述
第一步,因为B、D、E、G一定在A的左边,C、F一定在A的左边,所以可以先把A写在中间。
第二步,分析左子树,同理可得,先把B写在中间,因为只有D是B的左子树,那么D肯定在B的左边,以此类推…

def in_order(root):
    # 中序排列
    if root:
        in_order(root.lchild)
        print(root.data, end=',')
        in_order(root.rchild)

后序遍历

后序遍历则是先访问左子树和右子树,再访问根结点。以上棵树为例。
在这里插入图片描述
第一步,因为根结点最后访问,所以可以先把A写在最后,然后在访问左子树和右子树。
第二步,访问,D、G、E、B这棵左子树,同理可得,可以先把B写在最后,然后在访问左子树和右子树,以此类推…

def post_order(root):
    # 后序排列
    if root:
        post_order(root.lchild)
        post_order(root.rchild)
        print(root.data, end=',')

层次遍历

层次遍历是一层一层遍历,从左到右,从上到下,以上棵树为例。
在这里插入图片描述
逐层遍历。

from collections import deque
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)

总代码

from collections import deque


class BiTreeNode:
    def __init__(self, data):
        self.data = data
        self.lchild = None
        self.rchild = None

# ABCDE#F##G#####

class CreateBiTree:
    """
    str_tree: 传入字符串
    return: 返回根结点
    """
    def __init__(self, str_tree):
        self.str_tree = str_tree

    def create_tree(self):
        l1 = list(self.str_tree)
        l1 = [None if i == '#' else i for i in l1]
        nodes = [BiTreeNode(l1[i]) for i in range(len(l1))]
        root = nodes[0]
        for i in range(len(l1)):
            if 2*i+2 > len(l1):
                break
            cur_node = nodes[i]
            if nodes[2*i+1].data:
                cur_node.lchild = nodes[2*i+1]
            if nodes[2*i+2].data:
                cur_node.rchild = nodes[2*i+2]
        return root

    def __call__(self):
        return self.create_tree()

class BiTreeSorted:
    def __init__(self, root):
        self.root = root

    def pre_order(self, root):
        # 前序排列
        if root:
            print(root.data, end=',')
            self.pre_order(root.lchild)
            self.pre_order(root.rchild)

    def in_order(self, root):
        # 中序排列
        if root:
            self.in_order(root.lchild)
            print(root.data, end=',')
            self.in_order(root.rchild)


    def post_order(self, root):
        # 后序排列
        if root:
            self.post_order(root.lchild)
            self.post_order(root.rchild)
            print(root.data, end=',')

    def level_order(self, 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)

    def __call__(self):
        print('前序排列')
        self.pre_order(self.root)
        print()

        print('中序排列')
        self.in_order(self.root)
        print()

        print('后序遍历')
        self.post_order(self.root)
        print()

        print('层序遍历')
        self.level_order(self.root)
        print()

a = CreateBiTree('ABCDE#F##G#####')
root = a()
print('根结点为:', root.data)
sorted = BiTreeSorted(root)
sorted() # 调用__call__方法

结果为:
在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:55:08  更:2022-02-26 11:56:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 16:43:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码