【二叉树——数据结构】

news/2024/10/18 0:27:15/

文章目录

      • 1.二叉树
          • 1.基本概念.
          • 几种特殊的二叉树
      • 2.考点
      • 3.二叉树的存储结构
      • 4.二叉树的遍历
      • 5.线索二叉树

1.二叉树

1.基本概念.

在这里插入图片描述
二叉树是n(n>=0)个结点的有限集合
或者为空二叉树,即n=0
或者由一个根结点和两个互不相交的被称作根的左子树和右子树组成。
每个结点至多只有两棵子树
左右子树不能颠倒(二叉树是有序树)
二叉树是递归定义的数据结构
树转化为二叉树:左孩子,右兄弟

几种特殊的二叉树

1.满二叉树
在这里插入图片描述
在这里插入图片描述
特点

  1. 只有最后一层有叶子结点
  2. 不存在度为1的结点
  3. 按层序从1开始编号,结点i的左孩子为2i,右孩子为2i+1;结点i的父节点为i/2 (如果存在的话)

2.完全二叉树
在这里插入图片描述当且仅当其每个结点都与高度为h的满二叉树中编号为1-n的结点一-对应, 称为
完全二叉树
特点

  1. 只有最后两层可能有叶子结点
  2. 最多只有一 个度为1的结点
  3. 按层序从1开始编号,结点i的左孩子为2i,右孩子为2i+1;结点i的父节点为[i/2] (如果存在的话)
  4. i<=n/2为分支结点,i≥n/2为叶子结点
  5. 如果某个节点只有一个孩子, 那这个孩子一定是左孩子

3. 二叉排序树
在这里插入图片描述
左子树上所有结点的关键字均小于根节点的关键字;右节点上所有结点的关键字均大于根节点的关键字,左子树和右子树又各是一棵二叉排序树。
用于元素的排序,搜索
4.平衡二叉树
在这里插入图片描述
树上任一结点的左子树和右子树的深度之差不超过1
平衡二叉树能有更高的搜索效率

2.考点

  1. 设非空二叉树中度为0、1和2的结点个数分别为n0,n1和n2, 则n0 = n2+ 1
    (叶子结点比二分支结点多一个)
  2. 二叉树第i层至多有2^(i-1)个结点(i≥1)
  3. 高度为h的二叉树至多有2^h - 1个结点(满二叉树)
  4. 具有n个(n> 0)个结点的完全二叉树的高度h为[log(n + 1)]或[log n]+1
    编号为i的结点所在层次为[log(i + 1)]或[log i]+1
  5. 对于完全二叉树,可以由结点数推出度为0, 1和2的结点个数为n0,n1和n2
  6. 若完全二叉树有2k个(偶数)个结点,则必有n1=1, n0=k, n2= k-1
    若完全二叉树有2k-1个(奇数)个结点,则必有n1=0,n0=k, n2= k-1

3.二叉树的存储结构

顺序存储

#define MaxSize 100
struct TreeNode {ElemType value; //结点中的数据元素bool isEmpty; //结点是否为空
};
TreeNode t [MaxSize] ;

只适合存储完全二叉树

链式存储

//二又树的结点(壁式存储)
typedef struct BiTNode(ELemType data;//数据域struct BiTNode *lchld,rchild;//左、右孩子指针
}BiTNode,*BTree;

在这里插入图片描述
n个结点的二叉链表共有n+ 1个空链域

4.二叉树的遍历

按照某种次序把所有节点都访问一遍

先序遍历——O(n)
根左右
得到前缀表达式

中序遍历——O(n)
左根右
得到中缀表达式(未加界限符)

后序遍历——O(n)
左右根
得到后缀表达式

求树的深度

int treeDepth(BiTree T){if (T == NULL) {return 0;}else {int 1 = treeDepth(T->lchild);int r = treeDepth(T->rchild);//树的深度=Max(左子树深度,右子树深度)+1return l>r ? 1+1 : r+1;}
}

层次遍历

  1. 初始化一个辅助队列
  2. 根节点入队
  3. 若队列非空,则队头结点出队,访问该结点,并将其左右孩子插入队尾(如果有的话)
  4. 重复上一步直至队列为空
//层序遍历
void Levelorder(BiTree T){LinkQueue Q;InitQueue(Q) ;	//初始化辅助队列BiTree p;EnQueue(Q,T);	//将根结点入队while( !IsEmpty(Q)){	//队列不空则循环DeQueue(Q,p);	//队头结点出队visit(p);	//访问出队结点if(p- >lchild!=NULL)EnQueue(Q, p- >lchild); //左孩子入队if(p->rchild!=NULL)EnQueue(Q,p >rchild); //右孩子入队}
}
//二叉树的结点(链式存储)
typedef struct BiTNode{char data;struct BiTNode *lchild, 电rchild;
}BiTNode, *BiTree;
//链式队列结点
typedef struct LinkNode{BiTNode * data;struct LinkNode *next;
}LinkNode;
typedef struct{LinkNode *front, *rear; //队头队尾
}LinkQueue;

由遍历序列构造二叉树
若只给出-一个二叉树的前/中/后/层序遍历队列中的一-种,不能唯- -确定-棵二叉树
前序+中序遍历队列
后序+中序遍历队列
层序+中序遍历队列

前序、后序、层序
序列的两两组合无法唯一
确定一棵二叉树

5.线索二叉树

线索二叉树的作用——方便从一个指定结点出发,找到其前驱、后继;方便遍历线索二叉树的存储结构

//线索二叉树结点
typedef struct ThreadNode{ElemType data;struct ThreadNode *lchild, *rchild; int ltag, rtag; //左、 右线索标志
}ThreadNode ,*ThreadTree ;
//*Ichild | Itag | data | rtag  |*rchild
//tag==0,表示指针指向孩子
//tag==1,表示指针是"线索"

三种线索二叉树

  1. 先序线索二叉树——线索指向、 先序前驱、先序后继
    在这里插入图片描述

  2. 中序线索二叉树——线索指向、中序前驱、中序后继
    在这里插入图片描述

  3. 后序线索二叉树——线索指向、后序前驱、后序后继
    在这里插入图片描述
    二叉树的线索化
    中序线索化得到中序线索二叉树
    先序线索化-得到先序线索二叉树
    后序线索化得到后序线索二叉树
    核心
    中序/先序/后序遍历算法的改造,当访问一个结点时,连接该结点与前驱结点的线索信息
    用一个指针pre记录当前访问结点的前驱结点


http://www.ppmy.cn/news/1448480.html

相关文章

CSS中不固定大小的图片怎样做到在所在的块元素里垂直居中

对于不固定大小的图片&#xff0c;在块元素中实现垂直居中可以有多种方法。以下是一些常用的方法&#xff1a; 使用Flexbox&#xff08;弹性盒子&#xff09;: Flexbox 是一个非常强大的布局工具&#xff0c;可以轻松实现元素的垂直居中。你只需要将块元素设置为 flex 容器&a…

Go Web 开发基础【用户登录、注册、验证】

前言 这篇文章主要是学习怎么用 Go 语言&#xff08;Gin&#xff09;开发Web程序&#xff0c;前端太弱了&#xff0c;得好好补补课&#xff0c;完了再来更新。 1、环境准备 新建项目&#xff0c;生成 go.mod 文件&#xff1a; 出现报错&#xff1a;go: modules disabled by G…

网盘—下载文件

本文主要讲解网盘文件操作的下载文件部分&#xff0c;具体步骤如下&#xff1a; 目录 1、实施步骤 2、代码实现 2.1、添加下载文件的协议 2.2、添加下载文件函数 2.3、添加信号槽 2.4、实现槽函数 2.5、设置download状态 2.6、添加定义 2.7、服务器接收数据 2.8、添…

C语言中的指针常量和常量指针

指针常量和常量指针是C/C编程语言中两个重要的概念&#xff0c;它们都与指针有关&#xff0c;但具有不同的含义和用途。 1. 指针常量&#xff08;Pointer to Constant&#xff09; 指针常量指的是一个指针的值&#xff08;即它所指向的地址&#xff09;在初始化之后不能再被改…

vue 组件组件通信方法

1、父组件props传值给子组件。 子组件中定义props字段&#xff0c;类型为Array&#xff08;如需限制字段值类型&#xff0c;也可以定义为Object的形式&#xff09;。如下例子&#xff0c;父组件挂载子组件helloWorld&#xff0c;在组件标签上给title赋值&#xff0c;子组件hel…

【项目纪实】某国有航空公司人力资源系统诊断咨询项目

公司的人力资源管理问题一直都比较严重&#xff0c;比如人员冗余、员工工作积极性差等问题&#xff0c;虽然经过多次的管理尝试&#xff0c;存在的问题仍然没有缓解。华恒智信人力资源咨询公司的老师特别专业&#xff0c;帮我们系统、全面的诊断了人力资源管理上存在的问题&…

LabVIEW智能变电站监控系统设计与实现

LabVIEW智能变电站监控系统设计与实现 随着电力系统和智能化技术的快速发展&#xff0c;建立一个高效、可靠的变电站监控系统显得尤为重要。通过分析变电站监控系统的需求&#xff0c;设计了一个基于LabVIEW软件的监控平台。该平台利用虚拟仪器技术、传感器技术和无线传输技术…

Django后台项目开发实战六

日志记录 第六阶段 日志处理教程 Django 日志处理 我这里实现一个简单的日志&#xff0c;在 setting.py 文件添加日志 LOGGING {# 版本version: 1,# 是否禁止默认配置的记录器disable_existing_loggers: False,formatters: {simple: {format: %(asctime)s %(name)-12s %(linen…