数据结构---树和二叉树

这里写目录标题

树和二叉树的定义

树的定义

树 属于1:n的形式,属于非线性结构

有且仅有一个根,其余的都是子树

而字树也有自己的根和子树,所以,树是一个递归的定义

![在这里插入图片描述](https://img-blog.csdnimg.cn/677eb0f85d6945028e4fa02b208e06f4.png#pic_center

树的基本术语

结点的度:结点拥有的子树的个数,或者是分支的个数,或者是指针的个数

度=0:叶子

度!=0:分支节点或者叫内部节点

树的度:各节点度的最大值

树的深度:最大的层数(根节点为第一层),图中树的深度是四层

孩子:结点子树的根结点

双亲:与孩子反过来

例如:B是A的孩子;A是B的双亲

子孙:某节点子树中的任一个结点

祖先:从根到该结点所"途径"的"所有"结点,例如,H的祖先是A、D

一棵树也是森林,把一棵树的根结点去掉,就变成了三棵树,就是一个普通的森林,

森林加上一个双亲结点,就变成了一颗树

线性结构和树形结构的比较

二叉树的定义

起因

定义

注意 子树有左右之分,并且次序不能颠倒,根可以有空的左右子树

注意

二叉树:哪怕其中一个子树是空的 那么另一个子树也得在自己位置 并且区分左右

树:不区分左右,其中一个子树为空时,另一个只有一个位置

案例引入

前缀码编码

表达式的实现

二叉树的抽象类型定义


创建二叉树时,根据definition来构造 而definition的值分别对应着三个不同的遍历方式

二叉树的性质和存储结构

二叉树的性质

直接假设二叉树是满二叉树 也就是直接计算最多情况下的结点数,就是"至多"的结点数

第i层 那就是求等比数列的常数项 也就是a1*(q的n-1次方) a1是1

每层至少一个

等比数列求和

一共最少有k个

度为2:也就是有两个孩子的结点

证明:1.以总边数为桥梁

2.从下往上分析:每个结点头上都连着一个边,只有根结点没有,所以 总边数B=n-1(n是总结点数)

3.从上往下分析:B=2n2+1 n1

(n2、n1、分别表示度为2和度为1的结点数)

4.以B为桥梁 带入n=n2+n1+n0

二叉树的特殊形式

满二叉树


满二叉树 必须每个位置都有结点 每层都要满 叶子结点必须都在最后一层

完全二叉树


要从满二叉树中连续的去掉元素而不修改 也就是编号位置不能变 结点中存放的元素也不能变 就是将完全二叉树映射到满二叉树时 没有异常的地方 可以残缺 但不可以异常 并且 一定要从左往右是连续的 不能有缺口

完全二叉树的两个性质

因为是完全二叉树 去掉最后一层 就是满二叉树 补全最后一层 也是满二叉树 所以 可以利用满二叉树的性质来构造一个不等式,

去掉最后一层 就是满二叉树 那么不等式左边就是k-1层时的总结点数

补全最后一层 就是满二叉树 那么不等式右边就是k层时的总结点数

之后简化不等式 最后一步将小于号改成去小于x的最大整数

因为是完全二叉树 去掉最后一层 就是满二叉树 补全最后一层 也是满二叉树 所以 可以利用满二叉树的性质来构造一个不等式,之后简化不等式 最后一步将小于号改成去小于x的最大整数

总结来说 除了根结点

其他结点:双亲结点的编号是【i/2】

左孩子结点是2i

右孩子结点是2i+1

如果左右孩子的编号超出了最大结点数 那么就是孩子不存在

二叉树的存储结构

顺序存储结构

按照满二叉树的位置定义编号 再定义一个数组 编号对应数组下标


空值 数组位置不能缩进 仍然保留 数值为空

所以就造成了空间的浪费

链式存储结构

一般会有一个头指针指向根结点,上面的结构体是对结点的定义


除了根节点 其他结点一定有双亲 那么每个双亲肯定会牺牲一个链域来存放孩子的地址 所以 空指针数目是2n-(n-1)

遍历二叉树

简介

分类


遍历每一个子树时 将子树也按照整棵树的遍历方式遍历 ,也就是以根结点为参考 转换根结点的参考

先序

先以整个树为参考 先访问根结点

之后访问左子树:这时将左子树的B 看成根结点 继续采用先序的访问方式来访问B的左子树 依次类推 直到访问到左右子树为空的叶子结点 从而完成对左子树的访问

最后访问右子树:这时将右子树中的D看成根结点 继续采用先序的访问方式来访问D的左子树 依次类推递归 直到访问到左右子树为空的叶子结点 从而完成对右子树的访问

中序

先访问左子树:这时将左子树的B 看成根结点 继续采用先序的访问方式来访问B的左子树 依次类推 直到访问到左右子树为空的叶子结点 从而完成对左子树的访问

后序

案例

一级目录

二级目录

二级目录

二级目录

相关推荐
C++忠实粉丝4 小时前
前缀和(8)_矩阵区域和
数据结构·c++·线性代数·算法·矩阵
ZZZ_O^O5 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
代码雕刻家6 小时前
数据结构-3.9.栈在递归中的应用
c语言·数据结构·算法
Kalika0-07 小时前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法
代码雕刻家7 小时前
课设实验-数据结构-单链表-文教文化用品品牌
c语言·开发语言·数据结构
小字节,大梦想9 小时前
【C++】二叉搜索树
数据结构·c++
我是哈哈hh9 小时前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝
丶Darling.10 小时前
LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
数据结构·c++·学习·算法·leetcode·二叉树
labuladuo52010 小时前
Codeforces Round 977 (Div. 2) C2 Adjust The Presentation (Hard Version)(思维,set)
数据结构·c++·算法
Indigo_code10 小时前
【数据结构】【链表代码】合并有序链表
数据结构·windows·链表