【二叉树——数据结构】

文章目录

      • 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.mzph.cn/news/831072.shtml

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

相关文章

向gitee推送项目

步骤很详细&#xff0c;直接上教程 在gitee新建项目并复制链接 在当前项目目录打开git bash 输入以下指令进行初始化 git init配置个人信息 git config --global user.name 你的昵称 git config --global user.email 账号绑定的邮箱 5. 绑定远程仓库地址 git remote add ori…

JDBC连接MySQL8 SSL

1.创建用户并指定ssl连接 grant all on . to test% identified by imooc require SSL(X509); 2.查看是否使用ssl SELECT ssl_type From mysql.user Where user"test" 3.配置用户必须使用ssl ALTER USER test% REQUIRE SSL(X509); FLUSH PRIVILEGES; 注意&#xff…

Vue 之 在当前页面的实现分页效果

目录 场景实现 场景 假设&#xff0c;我们现在有这么一个需求&#xff1a; 上述图片的空白内容是活动的&#xff0c;由下面的两个按钮控制上一页、下一页&#xff1b;我们应该可以怎么去实现&#xff1f; 实现 思路&#xff1a; 其实这个问题&#xff0c;我们仿照其他的UI框…

接收区块链的CCF会议--APSEC 2024 截止7.13 附录用率

会议名称&#xff1a;APSEC&#xff08;Asia-Pacific Software Engineering Conference&#xff09; CCF等级&#xff1a;CCF C类学术会议 类别&#xff1a;软件工程/系统软件/程序设计语言 录用率&#xff1a;2023年&#xff0c;90 submissions were recommended for accep…

算法二:DOM - 将DOM节点元素转换成JSON字符串

题目&#xff1a; 将DOM节点元素转换成JSON的格式 例如 <div class"root"><div class"child1"><p></p></div><span></span><div><div><p></p></div></div><p></…

Web前端开发之CSS_2

关系选择器CSS盒子模型弹性盒子模型文档流浮动清除浮动定位 1. 关系选择器 1.1 后代选择器 E F{} 选择所有被 E 元素包含的 F 元素&#xff0c;中间用空格隔开 <ul> <li>后代列表1</li> <div> <ol> <li>后代列表2</li> </ol>…

力扣刷题第0天:只出现一次的数字

目录 第一部分:题目描述 ​第二部分:题目分析 第三部分:解决方法 3.1思路1: 双指针暴力求解 3.2 思路2&#xff1a;异或运算 第四部分:总结收获 第一部分:题目描述 第二部分:题目分析 由图片分析可得&#xff0c;该题目对算法时间复杂度有一定的要求时间复杂度为O(N)&a…

知乎广告投放怎么操作?如何开通知乎广告账户?

知乎作为一个汇聚知识精英与行业领袖的问答社区&#xff0c;其独特的平台属性和高质量的用户基础&#xff0c;使之成为品牌广告投放不可忽视的一片蓝海。云衔科技通过专业化的广告开户及代运营服务&#xff0c;助力企业精准触达目标人群&#xff0c;实现品牌传播与商业目标的双…

【源码阅读】Golang中的go-sql-driver库源码探究

文章目录 前言一、go-sql-driver/mysql1、驱动注册&#xff1a;sql.Register2、驱动实现&#xff1a;MysqlDriver3、RegisterDialContext 二、总结 前言 在上篇文章中我们知道&#xff0c;database/sql只是提供了驱动相关的接口&#xff0c;并没有相关的具体实现&#xff0c;具…

2024五一杯数学建模C题思路分享 - 煤矿深部开采冲击地压危险预测

文章目录 1 赛题选题分析 2 解题思路2.1 问题重述2.2 第一问完整思路2.2 二、三问思路更新 3 最新思路更新 1 赛题 C题 煤矿深部开采冲击地压危险预测 煤炭是中国的主要能源和重要的工业原料。然而&#xff0c;随着开采深度的增加&#xff0c;地应力增大&#xff0c;井下煤岩动…

键盘更新计划

作为 IT 搬砖人&#xff0c;一直都认为键盘没有什么太大关系。 每次都是公司发什么用什么。 但随着用几年后&#xff0c;发现现在的键盘经常出问题&#xff0c;比如说调节音量的时候通常莫名其妙的卡死&#xff0c;要不就是最大音量要不就是最小音量。 按键 M 不知道什么原因…

Java | Leetcode Java题解之第60题排列序列

题目&#xff1a; 题解&#xff1a; class Solution {public String getPermutation(int n, int k) {int[] factorial new int[n];factorial[0] 1;for (int i 1; i < n; i) {factorial[i] factorial[i - 1] * i;}--k;StringBuffer ans new StringBuffer();int[] valid…

[数据结构]———交换排序

目录 ​编辑 ​编辑 1.交换排序 第一个定义了一个名为Swap的函数 第二个三数取中 2.冒泡排序 代码解析 冒泡排序的特性总结&#xff1a; 3.快速排序 1. hoare版本 2. 挖坑法 代码解析 3. 前后指针版本 代码解析 1.交换排序 基本思想&#xff1a;所谓交换&#xff0…

virtualbox kafka nat + host-only集群 + windows 外网 多网卡

virtualbox kafka nat + host-only集群 + windows 映射访问 kafka集群搭建背景kafka集群搭建 背景 使用virtualbox搭建kafka集群,涉及到不同网络策略的取舍 首先 桥接 网络虽说 啥都可以,但是涉及到过多ip的时候,而且还不能保证使用的ip不被占用,所以个人选择kafka虚拟机…

java-链表排序

需求 思路 排序&#xff1a;讲所有的值都取出来&#xff0c;存储到ArrayList中&#xff0c;然后排序&#xff0c;将排序之后的元素依次使用add方法添加到自定义链表合并排序&#xff1a;先合并&#xff0c;然后调用刚才写的排序算法合并&#xff1a;将表一的头结点作为新链表的…

开发日志:Kylin麒麟操作系统部署ASP.NET CORE

需求场景&#xff1a; 我需要部署的项目是在Windows上开发的&#xff0c;目标框架为.net core 6.0 因此我们需要先在kylin上部署项目运行所需要的环境。 借助百度词条&#xff0c;先看看Kylin是什么&#xff1a; 服务器资源&#xff1a; 查看系统版本 cat /etc/kylin-releas…

MyBatis 核心配置讲解(下)

大家好&#xff0c;我是王有志&#xff0c;一个分享硬核 Java 技术的互金摸鱼侠。 我们书接上回&#xff0c;继续聊 MyBatis 的核心配置&#xff0c;我们今天分享剩下的 5 项核心配置。 不过正式开始前&#xff0c;我会先纠正上一篇文章 MyBatis 核心配置讲解&#xff08;上&…

React 第十二章 UmiJs

Umi.js 介绍 Umi 是由蚂蚁集团推出的可扩展的企业级前端应用框架。Umi 以路由为基础&#xff0c;同时支持配置式路由和约定式路由&#xff0c;保证路由的功能完备&#xff0c;并以此进行功能扩展。然后配以生命周期完善的插件体系&#xff0c;覆盖从源码到构建产物的每个生命周…

OpenGL 入门(一)—— OpenGL 基础

1、OpenGL 基础知识 1.1 OpenGL 简介 OpenGL&#xff08;Open Graphics Library&#xff09;是图形领域的工业标准&#xff0c;是一套跨编程语言、跨平台、专业的图形编程&#xff08;软件&#xff09;接口。它用于二维、三维图像&#xff0c;是一个功能强大&#xff0c;调用…

PySpark学习---销售情况数据统计分析案例

需求分析&#xff1a; 某公司是做零售相关业务&#xff0c;旗下出品各类收银机. 目前公司的收银机已经在全国铺开,在各个省份均有店铺使用.机器是联网的,每一次使用都会将售卖商品数据上传到公司后台.老板现在想对省份维度的销售情况进行统计分析 逻辑需求&#xff1a; 1.各省销…