python二叉树链树_树的链式存储结构

二叉链树是一种树状数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。每个节点包含一个数据元素和指向其左右子节点的指针。二叉链树可以是空树,也可以是具有以下特点的非空树:
1. 每个节点最多有两个子节点。
2. 左子节点和右子节点的顺序是固定的,即左子节点始终位于父节点的左侧,右子节点始终位于父节点的右侧。
3. 每个节点的子节点也可以是空节点,表示该节点没有对应的子节点。

二叉链树常用于实现二叉搜索树、堆、表达式树等数据结构和算法。

广度优先遍历:

二叉树的广度优先遍历(BFS)是从树的根节点开始,按照层次的顺序依次访问每一层的节点,直到遍历完整棵树为止。具体步骤如下:

1. 首先将根节点入队列。
2. 从队列中取出一个节点,访问该节点,并将其所有子节点依次入队列。
3. 重复步骤2,直到队列为空。

在遍历过程中,节点的访问顺序是按照从上到下、从左到右的顺序进行的。通过这种方式,可以逐层地访问二叉树的所有节点,实现广度优先遍历。

    def breadth_travel(self):
        """广度遍历"""
        if self.root == None:
            return
        queue=[self.root]
        while queue:
            cur_node = queue.pop(0)
            print(cur_node.data,end=" ")
            if cur_node.lchild is not None:
                queue.append(cur_node.lchild)
            if cur_node.rchild is not None:
                queue.append(cur_node.rchild)

先序遍历:

二叉树的先序遍历(preorder traversal)是一种深度优先遍历方式,具体步骤如下:

1. 访问根节点。
2. 递归地对根节点的左子树进行先序遍历。
3. 递归地对根节点的右子树进行先序遍历。

在遍历过程中,节点的访问顺序是根节点、左子树、右子树。通过先序遍历,可以按照根节点、左子树、右子树的顺序访问二叉树的所有节点。

    def preorder(self, root):
        """先序遍历"""
        if root is None:
            return
        print(root.data, end=" ")
        self.preorder(root.lchild)
        self.preorder(root.rchild)

中序遍历:

二叉树的中序遍历(inorder traversal)是一种深度优先遍历方式,具体步骤如下:

1. 递归地对根节点的左子树进行中序遍历。
2. 访问根节点。
3. 递归地对根节点的右子树进行中序遍历。

在遍历过程中,节点的访问顺序是左子树、根节点、右子树。通过中序遍历,可以按照左子树、根节点、右子树的顺序访问二叉树的所有节点。

    def inorder(self, root):
        """中序遍历"""
        if root is None:
            return
        self.inorder(root.lchild)
        print(root.data, end=" ")
        self.inorder(root.rchild)

 后续遍历:

二叉树的后序遍历(postorder traversal)是一种深度优先遍历方式,具体步骤如下:

1. 递归地对根节点的左子树进行后序遍历。
2. 递归地对根节点的右子树进行后序遍历。
3. 访问根节点。

在遍历过程中,节点的访问顺序是左子树、右子树、根节点。通过后序遍历,可以按照左子树、右子树、根节点的顺序访问二叉树的所有节点。

    def postorder(self, root):
        """后序遍历"""
        if root is None:
            return
        self.postorder(root.lchild)
        self.postorder(root.rchild)
        print(root.data, end=" ")


全部代码: 

class Node:
    def __init__(self,data):
        self.data = data
        self.lchild = None
        self.rchild = None
class Tree:
    def __init__(self):
        self.root = None
    def add(self,data):
        node = Node(data)
        if self.root is None:
            self.root = node
            return
        queue = [self.root]
        while queue:
            cur_node = queue.pop(0)
            if cur_node.lchild is None:
                cur_node.lchild = node
                return
            else:
                queue.append(cur_node.lchild)
            if cur_node.rchild is None:
                cur_node.rchild = node
                return
            else:
                queue.append(cur_node.rchild)
    def breadth_travel(self):
        """广度遍历"""
        if self.root == None:
            return
        queue=[self.root]
        while queue:
            cur_node = queue.pop(0)
            print(cur_node.data,end=" ")
            if cur_node.lchild is not None:
                queue.append(cur_node.lchild)
            if cur_node.rchild is not None:
                queue.append(cur_node.rchild)
    def preorder(self, root):
        """先序遍历"""
        if root is None:
            return
        print(root.data, end=" ")
        self.preorder(root.lchild)
        self.preorder(root.rchild)
    def inorder(self, root):
        """中序遍历"""
        if root is None:
            return
        self.inorder(root.lchild)
        print(root.data, end=" ")
        self.inorder(root.rchild)
    def postorder(self, root):
        """后序遍历"""
        if root is None:
            return
        self.postorder(root.lchild)
        self.postorder(root.rchild)
        print(root.data, end=" ")

    def no_preorder(self,root):
        """非递归的先序遍历"""
        if root==None:
            return
        alist=[root]
        while alist:
            cur=alist.pop()
            print(cur.data)
            if cur.rchild != None:
                alist.append(cur.rchild)
            if cur.lchild != None:
                alist.append(cur.lchild)
    def no_inorder(self,root):
        cur=root
        alist=[]
        while cur or alist:
            if cur!=None:
                alist.append(cur)
                cur=cur.lchild
            else:
                cur=alist.pop()
                print(cur.data)
                cur=cur.rchild

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/179175.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity 三维场景的搭建 软件构造实验报告

实验2:仿真系统功能实现 1.实验目的 (1)熟悉在Unity中设置仿真场景; (2)熟悉在Unity中C#语言的使用; (3)熟悉仿真功能的实现。 2.实验内容 新建一个仿真场景&#x…

[操作系统]进程和线程

目录 1.什么是进程 1.1进程控制块抽象 1.2 CPU 分配 —— 进程调度(Process Scheduling) 1.3内存分配 —— 内存管理(Memory Manage) 1.4进程间通信(Inter Process Communication) 2.线程 2.1概念 2.2为什么要有线程 2.3线…

《DApp开发:开启全新数字时代篇章》

随着区块链技术的日益成熟,去中心化应用(DApp)逐渐成为数字世界的新焦点。在这个充满无限可能的全新领域,DApp开发为创新者们提供了开启数字时代新篇章的钥匙。 一、DApp:区块链创新成果 DApp是建立在区块链技术基础之…

【追求卓越09】算法--散列表(哈希表)

引导 通过前面几个章节的学习(二分查找,跳表),我们发现想要快速查找某一个元素,首先需要将所有元素进行排序,再利用二分法思想进行查找,复杂度是O(logn)。有没有更快的查找方式呢? 本…

【产品安全平台】上海道宁与Cybellum将整个产品安全工作流程整合到一个专用平台中,保持构建的互联产品的网络安全和网络合规性

Cybellum将 整个产品安全工作流程 整合到一个专用平台中 使设备制造商能够 保持他们构建的互联产品的 网络安全和网络合规性 产品安全性对 每个人来说都不一样 每个行业的系统、工作流程和 法规都存在根本差异 因此,Cybellum量身定制了 Cybellum的平台和技…

排序算法--快速排序

实现逻辑 ① 从数列中挑出一个元素,称为 “基准”(pivot), ② 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这…

探索实人认证API:保障在线交互安全的关键一步

前言 在数字化时代,随着人们生活的日益数字化,各种在线服务的普及,安全性成为用户体验的至关重要的一环。特别是在金融、电商、社交等领域,确保用户身份的真实性显得尤为重要。而实人认证API作为一种先进的身份验证技术&#xff…

mysql的联合索引最左匹配原则问题

MySQL的联合索引 联合索引的最左匹配原则会一直向右匹配直到遇到范围查询(>、<、between、like) 就会停止匹配。 这个结论并不全对&#xff01;去掉 「between 和 like 」这个结论就没问题了 经过实验的证明&#xff0c;我得出的结论是这样的&#xff1a; 联合索引的最…

t检验(连续变量)和卡方检验(分类变量)

目录 情形 不同种类的萼片差异 数据类型查看&#xff1a; 差异分析&#xff1a; 不同萼片的种类差异 数据准备 二分类卡方检验 绘图 情形 &#xff1a;当有两列数据进行分析比较时&#xff0c;一列为连续变量&#xff0c;一列数据为分类变量。 rm(list ls()) libra…

Linux编程 文件操作 creat open

文件描述符 文件描述符在形式上是一个非负整数。实际上&#xff0c;它是一个索引值&#xff0c;指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时&#xff0c;内核向进程返回一个文件描述符。 启动一个进程之后&#xff0c;…

使用Pytorch从零开始构建WGAN

引言 在考虑生成对抗网络的文献时&#xff0c;Wasserstein GAN 因其与传统 GAN 相比的训练稳定性而成为关键概念之一。在本文中&#xff0c;我将介绍基于梯度惩罚的 WGAN 的概念。文章的结构安排如下&#xff1a; WGAN 背后的直觉&#xff1b;GAN 和 WGAN 的比较&#xff1b;…

财报解读:将低价作为“唯一性基础武器”的京东,效果在慢慢显现

近日&#xff0c;京东集团公布了2023年第三季度财报。这是自创始人刘强东去年11月强势回归京东一线、主导一系列战略调整和人事组织改革近一年后的一份“成绩单”。 财报显示&#xff0c;第三季度京东实现收入2477亿元&#xff0c;同比增长1.7%&#xff1b;归属于公司普通股股…

Linux上通过SSL/TLS和start tls连接到LDAP服务器

一&#xff0c;大致流程。 1.首先在Linux上搭建一个LDAP服务器 2.在LDAP服务器上安装CA证书&#xff0c;服务器证书&#xff0c;因为SSL/TLS&#xff0c;start tls都属于机密通信&#xff0c;需要客户端和服务器都存在一个相同的证书认证双方的身份。3.安装phpldapadmin工具&am…

HubSpot驱动业务增长:客户拓展的完美引擎!

随着数字化时代的来临&#xff0c;企业面临着前所未有的挑战&#xff0c;尤其在拓展客户方面&#xff0c;传统的方法已经难以适应新的市场环境。在这个背景下&#xff0c;数字化时代的客户拓展变得更为复杂&#xff0c;企业需要更智能、更综合的解决方案来脱颖而出。 HubSpot作…

Java之API(上)

前言&#xff1a; 这一次内容主要是围绕Java开发中的一些常用类&#xff0c;然后主要是去学习这些类里面的方法。 一、高级API&#xff1a; (1)介绍&#xff1a;API指的是应用程序编程接口&#xff0c;API可以让编程变得更加方便简单。Java也提供了大量API供程序开发者使用&…

结构体与指针_sizeof_static_extern_函数指针数组_函数指针_回调函数

一、结构体与指针 #include <stdint.h> #include <stdlib.h> #include <stdio.h> #define up_to_down(uuu) (downdemo_t *)(uuu->beg) #define __plc__ typedef struct updemo_s{uint8_t *head;uint8_t *beg;uint8_t *end; }updemo_t; typedef struct do…

python爬虫HMAC加密案例:某企业信息查询网站

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关 一、找出需要加密的参数 js运行 atob(‘aHR0cHM6Ly93d3cucWNjLmNvbS93ZWIvc2VhcmNoP2tleT0lRTQlQjglODclRTglQkUlQkUlRTklOUI…

基于PHP的动漫周边购物系统

有需要请加文章底部Q哦 可远程调试 基于PHP的动漫周边购物系统 一 介绍 此动漫周边购物系统系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。用户可注册登录&#xff0c;购物下单&#xff0c;评论等。管理员登录后台可对动漫周边商品&#xff0c;用户…

JVM中判断对象是否需要回收的方法

在堆里面存放着Java 世界中几乎所有的对象实例&#xff0c;垃圾收集器在对堆进行回收前&#xff0c;第一件事情就是要确定这些对象之中哪些还“ 存活 ” 着&#xff0c;哪些已经 “ 死去 ”。 引用计数算法 引用计数法是一种内存管理技术&#xff0c;它是通过对每个对象进行引用…

实现el-input-number数字框带单位

实现的效果展示&#xff0c;可以是前缀单位&#xff0c;也可以是后缀单位。实现的思路就是动态修改伪元素 ::before 和 ::after 的 content值 实现二次封装数字框的代码如下&#xff1a; <template><el-input-numberref"inputNumber"v-model"inputVal…