07 二叉树

news2024/9/20 22:48:47

开始系统学习算法啦!为后面力扣和 蓝桥杯的刷题做准备!这个专栏将记录自己学习算法是的笔记,包括 概念, 算法运行过程,以及 代码实现,希望能给大家带来帮助,感兴趣的小伙伴欢迎评论区留言或者私信博主哦!今天更新的是 《07 二叉树》

目录

一、树概念

二、性质

三、特殊二叉树

四、二叉树的节点及树的创建

五、二叉树的遍历

5.1深度优先遍历

先序遍历

中序遍历

后续遍历

5.2 广度优先遍历(层次遍历)


一、树概念

二叉树是每个节点最多有两个子树的树结构。通常子树被称作”左子树“(left subtree)和”右子树“(right subtree)。

二、性质

  1. 在二叉树的第i层上至多有2^(i-1)个节点(i>0)
  2. 深度为k的二叉树至多有2^k-1个节点
  3. 对于任意一颗二叉树,如果其叶节点数为N0,而度数为2 的节点总书为N2,那么N0 = N2+1
  4. 具有n个系欸点的完全二叉树的深度必为log2(n+1)
  5. 对完全二叉树 ,若从上到下、从左到右编号,则编号为i的结点,其左孩子编号必为2i,其右孩子编号必为2i+1;其双氢的编号必为i/2 (i=1时为根除外)

三、特殊二叉树

完全二叉树:设二叉树的高度为h,除第h层外,其他各层(1~h-1)的节点数都达到最大个数,第h层有叶子节点,并且叶子节点都是从左到右依次排布,这就是完全二叉树。

满二叉树:除了叶节点外每个节点都有左右子叶且叶子节点都处在最外层的二叉树

四、二叉树的节点及树的创建

  • 节点创建
class Node(object):
    def __init__(self,elem=-1,lchild=None,rchild=None):
        self.elem = elem
        self.lchild = lchild
        self.rchild = rchild
  • 树的初始化
class Tree(object):
    def __init__(self,root = None):
        self.root =root
  • 添加节点
    def add(self,elem):
        # 首先创建节点
        node = Node(elem)
        # 如果树是空的,则对root根赋值
        if self.root == None:
            self.root = node
        else:
            queue = []
            queue.append(self.root)
            # 对已有的节点进行层次遍历
            while queue:
                cur = queue.pop(0)
                if cur.lchild == None:
                    cur.lchild = node
                    return
                elif cur.rchild == None:
                    cur.rchild = node
                    return
                else:
                    #如果左右子树都不为空,加入队列继续判断
                    queue.append(cur.lchild)
                    queue.append(cur.rchild)

五、二叉树的遍历

树的遍历是书的一种重要的运算,所谓遍历是指对树中所有节点的信息的访问,即一次对树中每个节点访问一次且仅访问一次,我们把这种对所有节点的访问称为遍历(traveral)。那么树的两种重要的遍历模式是深度优先遍历和广度优先遍历,深度优先一般用递归,广度优先一般用队列,一般情况下能用递归实现的算法大部分也能用堆栈来实现

5.1深度优先遍历

对于一颗二叉树,深度优先搜素(Depth First Search)是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。

那么深度遍历有重要的三种方法。这三种方式常被用于访问树的节点,他们之间的不同在于访问每个节点的次序不同。这三种遍历分别叫做先序遍历(preorder),中序遍历(inorder),和后序遍历(prstorder)。我们给出详细定义,然后举例看看它们的应用。

  • 先序遍历

在先序遍历中,我们先访问根节点,然后递归使用先序遍历访问左子树,然后再递归使用先序遍历访问右子树。

访问的顺序为:根节点->左子树->右子树

代码实现

class Tree(object):
    def preorder(self,root):
        if root == None:
            return
        print(root.item)
        self.preorder(root.lchild)
        self.preorder(root.rchild)
  • 中序遍历

在中序遍历中,我们递归使用中序遍历访问左子树,然后访问根节点,最后再递归使用中序遍历访问右子树

访问顺序为:左子树->根节点->右子树

代码实现

class Tree(object):
    def inorder(self,root):
        if root == None:
            return
        self.inorder(root.lchild)
        print(root.item)
        self.inorder(root.rchild)
  • 后续遍历

在后续遍历中,我们先递归使用后序遍历访问左子树和右子树,最后访问根节点。

访问顺序为:左子树->右子树->根节点

代码实现

class Tree(object):
    def postorder(self,root):
        if root == None:
            return
        self.postorder(root.lchild)
        self.postorder(root.rchild)
        print(root.item)

5.2 广度优先遍历(层次遍历)

从树的root开始,从上到下从左到右遍历整个树的节点

代码实现

class Tree(object):
    def breath_travel(self):
        if self.root == None:
            return
        queue = []
        queue.append(self.root)
        while queue:
            node =queue.pop(0)
            print(node.elem)
            if node.lchild != None:
                queue.append(node.lchild)
            if node.rchild != None:
                queue.append(node.rchild)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CHAPTER 1 Web Server - apache(httpd)

Web Server - apache1.1 概念介绍1.1.1 什么是Web Service?1.1.2 什么是Web Server?1.1.3 常见的Web服务程序有哪些?1.2 httpd1.2.1 httpd和apache的区别关系1.2.2 httpd版本介绍1.2.3 httpd安装1. yum 安装2. 编译安装1.3 通过systemctl管理httpd1.3.1 配置文件原因1.3.2 为…

析构函数、拷贝构造

1、析构函数析构函数的定义方式函数名和类名相同,在类名前加~,没有返回值类型,没有函数形参(不能重载)当对象生命周期结束的时候,系统会自动调用析构函数先调用析构函数,再释放对象的空间析构函…

C#中多态、抽象类、虚方法

多态、重装、重写 •多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。抽象类、虚函数、接口三种方法实现的可以是多态性。•重载(overload):对象中同名函数&…

【Galois工具开发之路】给你的JVM安装一个插件~

什么是DCEVM Dcevm(DynamicCode Evolution Virtual Machine)是Java Hostspot的一个扩展插件,属于开源性工具,非JDK官方提供,它允许你在运行环境下修改加载的类文件。当前虚拟机只允许修改方法体(Method&am…

【Python学习笔记】43.Python3 JSON 数据解析及日期和时间

前言 本章介绍python的JSON及日期和时间。 Python3 JSON 数据解析 JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。 Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它包含了两个函数: json.dumps(): 对数据进行编码。json…

苏宁基于 AI 和图技术的智能监控体系的建设

汤泳,苏宁科技集团智能监控与运维产研中心总监,中国商业联合会智库顾问,致力于海量数据分析、基于深度学习的时间序列分析与预测、自然语言处理和图神经网络的研究。在应用实践中,通过基于 AI 的方式不断完善智能监控体系的建设&a…

C# 业务单据号生成器(定义编号规则、自动获取编号)

系列文章 C#底层库–数据库访问帮助类(MySQL版) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/126886379 C#底层库–JSON帮助类_详细(序列化、反序列化、list、datatable) 本文链接:htt…

用友Java架构师面试

自我介绍。项目中的一些优化。Q:kafka消息的时序性怎么保证?A1: 核心意思就是要实现局部有序,需要有序的消息应设置相同的key,这样通过哈希取模后会分到同一个partition。又因为一个partition只能被一个consumer组中的…

智慧校园信息化管理平台技术方案

1.2总体架构设计 智慧校园平台是以学校现有网络为基础,以服务于全校师生的教学、科研、生活为目的,建立在学校数据中心平台之上,涵盖了学校的学校管理、学生管理、教学管理、班级管理、家校共育、教务管理等全方位的管理信息平台与信息服务平…

阿里P8经验分享 —— 送给想要学习自动化测试的同学6条建议

基于我的经验,送给想要学习自动化测试的同学6条建议 第一条建议:先学习编程语言,然后再接触自动化工具。 语言选择上Java或者Python都是可以的,可以先从Python入手,之后再开始Java。在学习语言的过程中,一…

playwright python环境运行报错 ImportError: DLL load failed

网上建议网上好多文章介绍playwright的环境搭建,用以下两条语句即可完成pip install playwrightplaywright install安装完毕后,尝试执行一段经典的python demofrom playwright.sync_api import sync_playwright with sync_playwright() as p: browser p…

seo优化案例截图

点击进入》》三支一扶课程聚合页面 百度统计数据 流量稳步增长, 2022年9月比2021年9月 同期增长 约30%。

SpringCloud - Nacos

目录 服务注册到Nacos 服务分级存储模型 NacosRule负载均衡 服务实例的权重设置 环境隔离 Nacos与Eureka的对比 添加Nacos配置 微服务配置拉取 配置热更新 多环境配置共享 服务注册到Nacos 1.在父工程引入SpringCloudAlibaba的依赖 2.注释掉order-service和user-ser…

@KafkaListener 详解及消息消费启停控制

参考:Kafka参数一、KafkaListener注解KafkaListener(id "11111", groupId "demo-group",topics Constants.TOPIC)public void listen(String msgData) {LOGGER.info("收到消息" msgData); } KafkaListener(id "22222"…

React系列之Redux

1 Redux概述 Redux 是 JavaScript 状态容器,提供可预测化的状态管理。Redux中文文档 Redux 和react没有必然关系,redux可以应用于各种框架,包括jquery,甚至js都可以使用redux,只不过redux和react更加搭配。redux也推…

javaee之git

一张图说明git 分支之间的操作 这个 框里面的linux命令都可以用 操作开始: 在master分支里面创建了一个hello.txt,并且放入了一些数据进去 这个去查一下日志 问题:当你放入了暂存区,你去查看日志会报错 一个分支这个指针head永…

Django框架之Django使用自带模板

Django使用自带模板 1 配置 在工程中创建模板目录templates。 在settings.py配置文件中修改TEMPLATES配置项的DIRS值: TEMPLATES [{BACKEND: django.template.backends.django.DjangoTemplates,DIRS: [os.path.join(BASE_DIR, templates)], # 此处修改APP_DIR…

vue-router 的基本用法

vue-router 的基本用法 1.什么是 vue-router vue-router 是 vue.js 官方给出的路由解决方案。它只能结合 vue 项目进行使用,能够轻松的管理 SPA 项目中组件的切换。 vue-router 的官方文档地址:https://router.vuejs.org/zh/ 2.vue-router 安装和配置的…

GIT分支管理策略

git基本操作git操作的前提条件:本地windows安装git学习idea中的插件使用idea的git基本操作:远程仓库remote更新fetch:git fetch拉取pull: git pull上传push: git push合并merge: git merge 合并分支本地提交commit:git commit分支branch: git branch 查看分支或者 切换分支上述…

SpringBoot整合Junit

创建项目 idea创建空项目Empty Project。项目中创建模块,选择SpringBoot Initialize快速构建SpringBoot项目。 依赖这里什么也不用选择。 pom文件中默认有两个依赖: spring-boot-starter springboot如果不导入任何依赖,默认的一个基础依赖。spring-…