数据结构学习记录-树和二叉树

server/2025/1/24 16:41:06/

1、树的概念

关于树的定义和基本术语

1、是一种非线性的数据结构,又叫做树型数据结构

2、树是n(n >=0)个节点的有限集合,当n=0时,叫空树

3、非空树必须满足两个条件:

        1、有且仅有一个特定的称为根的节点,

        2、其余的节点可以分为m(m >=0)个互不相交的有限集合T1、T2、......、Tm,其中每一个集合又是一棵 树,并称其为根的子树

树的相关概念:

1、节点的度:树中一个节点的孩子个数称为该节点的度, 所有节点的度的最大值是树的度

2、分支节点:度大于0的节点称为分支节点

3、叶子结点:度为0的节点称为叶子结点

4、节点的层次(深度):从上往下数,根节点为1层,依次往下加1

5、树的高度(深度):树中节点的最大层次

6、若树中节点的各子树从左至又是有次序的,不能互换,则该树称为有序树,否则称为无序树

7、双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点

8、孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;

9、兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点

10、森林:森林是m(m >= 0 )棵互不相交的树的集合,

11、树去掉根节点就成为森林,森林加上根节点就是树

如下图:一棵树

节点A的度:3                节点B的度:2                节点M的度:0

分支节点:A B C D E H                叶子节点:K L F G M I J

E节点的层次:第3层                树的高度:4

节点A的子节点:B C D                节点E的子节点:K L        

节点I的双亲节点:D                节点H I J 为兄弟节点

 树的逻辑结构:树中任何节点都可以有0个或多个直接后继节点(子节点),但最多只有一个直接前驱节点(父节点),

根节点没有前驱节点,叶子节点没有后继节点

 2、二叉树

1、二叉树的概念

二叉树Binary Tree是n个节点的有限集合,它或者是空集、或者是由一个根节点以及两颗互不相交、分别称为左子树和右子树的二叉树组成。

二叉树的特点:

        1、二叉树与 普通的有序树不同,二叉树严格区分左子和右子,即使只有一个子节点,也要区分左右

        2、二叉树的度数为2

2、二叉树的性质

 

1、二叉树的第k层上的节点最多有2k-1 个

2、深度为k的二叉树,最多有2k-1个节点

3、在任意一颗二叉树中,叶子结点的数目比度数为2的节点数目多1

证明:

N:结点的总数
N0:没有子结点的结点个数
N1:只有一个子结点的结点个数
N2:有两个子结点的结点个数
总结点 = 各节点数目之和 N = N0 + N1 + N2
总结点 = 所有子节点 + 根 N = 0 × N0 + 1 × N1 + 2 × N2 + 1
联立以上两式可得: N0 = N2 + 1

3、特殊的二叉树

两种比较特殊的二叉树:满二叉树和完全二叉树

1、满二叉树

深度为k(k>=1)时节点个数为2k-1

深度为k的满二叉树,总共有有2k-1个节点

 

2、完全二叉树

只有最下面两层可以有度数小于2的节点,且最下面一层的结点集中在最左边的若干位置上

 满二叉树也是特殊的完全二叉树

3、二叉树的实现

二叉树的存储结构有两种:顺序存储和链式存储

1、顺序存储

二叉树的顺序存储,指的是使用顺序表(数组)存储二叉树。需要注意,顺序存储只适用于完全二叉树。换句话说,只有完全二叉树才可以用顺序表存储。因此,如果我们想要顺序存储普通二叉树,就需要将其提前转换成完全二叉树。
普通二叉树转完全二叉树的方法很简单,只需给二叉树额外添加一些结点,将其"拼凑"成一个完全二叉树即可,但这时会造成一部分内存浪费,所以不建议使用顺序存储,实现二叉树。

 顺序存储,浪费空间

2、链式存储 

 

链式存储此二叉树,从根结点开始,将各个结点以及其左右子的地址使用链表进行存储。 

 

typedef int data_t;
typedef struct node_t
{data_t data ;struct node t *lchild ,*rchild ; 
}bitree_t;
bitree_t *root ;
//二叉树由根节点指针决定。

3、二叉树的遍历

遍历此二叉树,有3种方法:

1、先序遍历:根---->左----->右

2、中序遍历:左----->根------->右

3、后序遍历:左----->右------>根


http://www.ppmy.cn/server/161062.html

相关文章

【豆包MarsCode蛇年编程大作战】花样贪吃蛇

目录 引言 展示效果 prompt提示信息 第一次提示(实现基本功能) 初次实现效果 第二次提示(美化UI) 第一次美化后的效果 第二次美化后的效果 代码展示 实现在线体验链接 码上掘金使用教程 体验地址: 花样贪吃蛇…

java springboot 刷新 token 前后端 逻辑是啥 前端 vue

java springboot 刷新 token 前后端 逻辑是啥 前端 vue 在使用 Java Spring Boot 和 Vue.js 构建的前后端分离架构中,刷新 token 的逻辑通常涉及到以下几个方面: 后端(Spring Boot) Token 生成和验证: 使用如 JWT (JSON Web Tok…

python-leetcode-逆波兰表达式求值

150. 逆波兰表达式求值 - 力扣(LeetCode) class Solution:def evalRPN(self, tokens: List[str]) -> int:stack []for token in tokens:if token not in {, -, *, /}: # 如果是数字stack.append(int(token))else: # 如果是操作符b stack.pop()a …

【R语言】数学运算

一、基础运算 R语言中能实现加、减、乘、除、求模、取整、取绝对值、指数、对数等运算。 x <- 2 y <- 10 # 求模 y %% x # 整除 y %/% x # 取绝对值 abs(-x) # 指数运算 y ^x y^1/x #对数运算 log(x) #log()函数默认情况下以 e 为底 双等号“”的作用等同于identical(…

c++-------------------------继承

1.继承的概念和定义 1.1继承的概念 继承(inheritance)机制是⾯向对象程序设计使代码可以复⽤的最重要的⼿段&#xff0c;它允许我们在保持原有 类特性的基础上进⾏扩展&#xff0c;增加⽅法(成员函数)和属性(成员变量)&#xff0c;这样产⽣新的类&#xff0c;称派⽣类。继承 呈…

【优选算法】5----有效三角形个数

又是一篇算法题&#xff0c;今天早上刚做的热乎的~ 其实我是想写博客但不知道写些什么&#xff08;就水一下啦&#xff09; -------------------------------------begin----------------------------------------- 题目解析: 这道题的题目算是最近几道算法题里面题目最短的&a…

k8s使用nfs持久卷

开启持久化卷后可以实现服务开启在不同节点也能读取到和拿到服务节点的文件。 基本流程为将集群中一个节点作为服务节点安装共享储存应用的服务端选择目录和开启端口&#xff0c;其他节点根据端口挂载目录。然后使用kubesphere选择相应的镜像并将端口信息和挂载目录信息作为参…

Couchbase UI: Bucket

Couchbase UI 中的 Bucket 页面是管理和监控 bucket&#xff08;数据存储单元&#xff09;的核心部分&#xff0c;它提供了关于 bucket 的详细信息和操作功能。以下是 Bucket 页面主要功能和各部分的介绍&#xff1a; 1. Bucket 列表 (Buckets Overview) 在页面顶部会列出集…