数据结构-二叉树遍历线索二叉树

news2025/1/16 21:19:28

目录

一、二叉树的定义

*几种特殊的二叉树 

*二、二叉树的性质

三、二叉树的存储结构

*四、二叉树的遍历

*4.1先序遍历

* 4.2中序遍历

 * 4.3后序遍历

 非递归算法遍历

*4.4层序遍历

*五、遍历序列构造二叉树

 六、线索二叉树

6.1逻辑结构:

* 6.2构造线索二叉树


一、二叉树的定义

        二叉树是另一种树形结构,其特点是每个结点至多只有两课子树,并且二叉树的子树有左右之分,其次序不能任意颠倒

        空二叉树,即n=0

*几种特殊的二叉树 

     1.1满二叉树:一般高度为h,含有\tiny 2^h-1 个结点的二叉树称满二叉树,每层都含最多结点4

     1.2完全二叉树:高h,有n个结点的二叉树,当且仅当其每个结点都与高度为h的满二叉树中编号为1~n的结点一一对应,称完全二叉树

 1)有度为1的结点,则只可能有一个,有左孩子无右孩子

 2)若n为奇数,则每个分支都有左孩子和右孩子

       若n为偶数,编号最大的结点(n/2)只有左孩子,没有右孩子,其余分支结点左右孩子都有

1.3二叉树排序树:左子树上所有结点的关键字均小于根结点的关键字;右大于左关键字,左子树和右子树又各是一颗二叉排序树

1.4平衡二叉树:树上任一结点的左子树和右子树的深度之差不超过 1

*二、二叉树的性质

1)\tiny n_0=n_2+1                

\tiny n=n_0+n_1+n_2     \tiny n_0+n_1+n_2=n_1+2n_2+1         

2)第k层上至多有\tiny 2^{k-1}个结点

3)高度为h的二叉树至多有\tiny 2^h-1个结点

4)完全二叉树顺序编号有以下关系

        i的双亲结点为 \tiny \left \lfloor i / 2 \right \rfloor ,i为偶数它是左孩子,奇数右孩子

        \tiny 2i\leq n时,结点i的左孩子编号为 2i ,否则无左孩子

        \tiny 2i+1\leq n时,结点i的右孩子编号为 2i+1 ,否则无右孩子

        结点i的深度为:\tiny \left \lfloor log_2i \right \rfloor+1

5)具有n个结点的完全二叉树的高度为\tiny \left \lceil log_2(n+1) \right \rceil\tiny \left \lfloor log_2n \right \rfloor+1

三、二叉树的存储结构

3.1顺序存储结构

3.2链式存储结构

typedef struct BiTNode{
    int data;                        //数据域
    struct BiTNode *lchild,*rchild;  //左,右孩子指针
}BiTNode , *BiTree;

*四、二叉树的遍历

*4.1先序遍历

先访问根结点 ->左子树->右子树

void PreOrder(BiTree T){
    if(T!=NULL){
        viisit(T);            //访问根结点
        PreOrder(t->lchild);  //递归访问左子树
        PreOrder(t->rchild);  //递归访问右子树
    }
}

* 4.2中序遍历

左子树->访问根结点 ->右子树

void InOrder(BiTree T){
    if(T!=NULL){
        PreOrder(t->lchild);  //递归访问左子树
        viisit(T);            //访问根结点
        PreOrder(t->rchild);  //递归访问右子树
    }
}

 * 4.3后序遍历

左子树->右子树 ->访问根结点

void PostOrder(BiTree T){
    if(T!=NULL){
        PostOrder(T->lchild);  //递归访问左子树
        PostOrder(T->rchlid);  //递归访问右子树
        visit(T);              //访问根结点
    }
}

 非递归算法遍历

栈辅助

void InOrder(BiTree T){
    InitStack(S);
    BiTree p=T;
    while( p || IsEmpty(S)){
        if(p){
            push(S,p);
            p=p->lchild;
        }else{
            pop(S,p);
            visit(p);
            p=p->rchild;
        }
    }
}

*4.4层序遍历

 队列辅助

void LevelOrder(Bitree T){
    InitQueue(Q);
    BiTree p;
    EnQueue(Q,p);
    while(!IsEmpty(Q)){
        DeQueue(Q,P);
        visit(p);
        if(p->lchild!=NUll)
            EnQueue(Q,p->lchild);
        if(p->rchild!=NULL)
            EnQueue(Q,p->rchild);
    }
}

*五、遍历序列构造二叉树

例:先序序列(ABCDEFGHI)   中序序列(BCAEDGHFI)

 六、线索二叉树

在n个节点的二叉树中,有n+1个空指针

空指针总数\tiny 2n_0+n_1,又\tiny n_0=n_2+1,所以空指针总数为\tiny n_0+n_1+n_2+1=n+1

6.1逻辑结构:

tpyedef struct ThreadNode{
    int data;
    struct ThreadNode *lchild,*rchild;
    int ltag,rtag;
}ThreadNode,*ThreadTree;

如lchild无左子树,指向结点前驱,如rchild无右子树,指向结点后继。

ltag表示指向是左孩子还是前驱,rtag表示指向是右孩子还是后继。

* 6.2构造线索二叉树

先序线索二叉树,中序线索二叉树,后续线索二叉树

 通过中序遍历构造中序线索二叉树

void InThread(ThreadTree &p,ThreadTree &pre){
    if(p!=NULL){
        InThread(p->lchlid,pre);
        if(p->lchild==NULL){
            p->lchild=pre;
            p->ltag=1;
        }
        if(pre!=NULL&&pre->rchild==NUll){
            pre->rchild=p;
            pre->rtag=1;
        }
        pre=p;
        InThread(p->rchlid,pre);
    }
}
void CreatrInThread(ThreadTree T){
    ThreadTree pre=NULL;
    if(T!=NULL){
        InThread(T,pre);
        pre->rchild=NUll;
        pre->tag=1;
    }
}

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

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

相关文章

Mybatis Plus | 快速入门

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Mybatis Plus MyBatis-Plus(简称 MP)是一个基于 MyBatis 的增强工具,它对 Mybatis 的基础功能进行了增强,但未做任何改…

Qt 多语言界面设计概述

1、多语言界面设计概述 有些软件需要开发多语言界面版本,如中文版和英文版,并且在软件里可以方便地切换界面语言。Qt 为多语言界面提供了很好的支持,使用 Qt 的一些规则和工具,可以很方便地为应用程序开发提供多语言界面支持。 …

Shell脚本函数简介及运用(喜欢,适合,能在一起,是三码事)

一、函数的作用 语句块定义成函数约等于别名,定义函数,再引用函数 封装的可重复利用的具有特定功能的代码 二、定义函数 定义函数就是只将一段实现某个任务的命令序列封装进一个函数,便于使用和后期维护。 function 函数名() { 命令序列 }…

快速原型设计工具(Axure)的安装、汉化

〇、一些名词解释: 1. 草图 一般主要用于产品整理思路,寻找灵感,或者在产品团队内部互相讨论碰撞火花时使用。画 给自己看的,想怎么画就怎么画。 2. 低保真 打个比喻来说就像,用于“生产的图纸”,要简单易读…

Postgres:Win/Linux环境安装及一键部署脚本

1.Win安装Postgres (1)下载安装包 (2)开始安装 修改安装目录 选择要安装的组件 data也就是库表及数据的.dba文件存放目录 密码设置 端口设置 next next 开始安装 安装完成,Stack Builder 根据需要选择是否安装。仅仅是…

03-Docker容器命令

新建启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG...]常用的参数: --namenew_name:为容器指定一个名称-d:后台运行容器并返回容器ID,即启动守护式容器-i:以交互模式(interactive)运行…

【三十天精通Vue 3】第二十九天 Vue 3中的Mock数据模拟详解

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录 引言一、Mock数据模拟的概述1.1 为什么需要Mock数据模拟?1.2 Mock数据模拟的优点和缺点二、安装和配置Mock.js库2.1 使用NPM安…

TIA博途Wincc通过区域指针中的作业信箱功能实现自动写入配方数据的具体方法

TIA博途Wincc通过区域指针中的作业信箱功能实现自动写入配方数据的具体方法 前面和大家分享了博途Wincc中配方功能的具体使用方法,具体内容可参考以下链接中的内容: TIA博途Wincc中自定义配方画面的具体方法示例 上面的例子中,向PLC写入数据时是通过点击屏幕上的按钮来实现…

scrapy爬虫标准流程

Scrapy爬虫的标准流程一般包括以下几个步骤: 1、明确需求和目标网站的结构,确定需要爬取的数据以及爬取规则。 2、创建一个Scrapy项目,使用命令行工具创建一个新的Scrapy项目。 3、定义数据模型和item,即确定要爬取的数据结构。…

基于SpringBoot开发的仓库管理系统

系统概要 仓库管理系统总共分为两个大的模块,分别是系统模块和业务模块。其中系统模块和业务模块底下又有其子模块。 功能模块 一、业务模块 1、客户管理 客户列表 客户分页和模糊查询 客户添加、修改、删除、批量删除 2、供应商管理 供应商列表 供应商分…

sql注入合集

1.Access注入 http://110.40.154.212:8002/Production/PRODUCT_DETAIL.asp?id1513 and exists(select count(*) from admin) #存在admin表,继续爆,还存在job,email,product等http://110.40.154.212:8002/Production/PRODUCT_DETAIL.asp?id1513 and e…

软考A计划-重点考点-专题二(程序语言)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

GP04丨网格框架初版

量化策略开发,高质量社群,交易思路分享等相关内容 正文 大家好,今天我们分享股票社群第4期量化策略——网格策略。 在上一期中,我们分享了ETF轮动策略Plus版本(基于资金管理的ETF增强策略),本…

Linux-Day02

Linux-Day02 课程内容 软件安装 项目部署 1. 软件安装 1.1 软件安装方式 在Linux系统中,安装软件的方式主要有四种,这四种安装方式的特点如下: 安装方式特点二进制发布包安装软件已经针对具体平台编译打包发布,只要解压&am…

哪种蓝牙耳机音质最好佩戴舒服?佩戴舒适音质好的蓝牙耳机

蓝牙无线耳机基本成为了大家的标配,大多数 对于外观与舒适性十分看重,如今的蓝牙耳机市场已经很成熟了,基本能满足大多数人,下面就来分享几款佩戴并且音质表现也不错的蓝牙耳机。 一、南卡小音舱Lite2蓝牙耳机 参考价格&#xf…

【机器人仿真Webots教程】-控制器编程指南

Webots controller编程指南 文章目录 Webots controller编程指南1. controller程序设计流程1.1 controller与场景树节点1.2 进程角度分析1.3 仿真时间步长与控制器程序更新延时步长 2. 例解控制器编程2.1 Hello world 实例2.2 传感器读取实例2.3 执行器的使用2.4 传感器与执行器…

距离保护整定计算中分支系数公式理解

在一般的距离保护II段和III段的整定计算中,分支系数的计算是必须要的,本文选自电力系统继电保护(第二版)(张保会老师主编)P94-P97页的例题,分析其中分支系数的计算公式。 我们在前面的章节中知道…

springboot+jsp影院管理系统9ufid电影票预订管理系统

项目介绍开发语言:Java 框架:springboot 技术:JSP JDK版本:JDK1.8 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 浏览器:谷歌浏览器 功能介绍 主要对…

HTB靶机08-Nineveh-WP

008-nineveh 靶机IP: 10.10.10.43 scan Nmap 扫描 ┌──(xavier㉿kali)-[~] └─$ sudo nmap -sSV -T4 10.10.10.43 -p- Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-07 17:40 CST Nmap scan report for nineveh.htb (10.10.10.43) Host is up (0.34s …

linux系统安装nginx 支持ssl

目录 1. 开放80端口和443端口 2. 安装nginx的基础环境 -> 2.1 安装gcc-c编译器 -> 2.2 安装pcre包 -> 2.3 安装zlib包(可能安装过) 3. 安装nginx -> 3.1 创建文件夹 -> 3.2 在官网下载nginx包到服务器内 -> 3.3 解压tar.gz,并进入nginx-1.19.9 -&g…