数据结构——二叉树

时间:2024-04-19 07:21:42

一、树

1.树的定义和相关概念

        树是一种非线性的数据结构,它是由n个有限节点组成一个具有层次关系的集合。它是根朝上,叶朝下的。

       根节点:根节点就是起始点(root),没有前驱节点

        除根节点以外,每个节点被分成一棵结构与树类似的子树,每棵子树的根节点有且只有一个前驱,可以有0或多个后继。

树具有的一些性质(区别树与非树)

        1.子树是不相交的

        2.除根节点以外,每个节点有且只有一个父节点。

        3.一颗N个节点的树有N-1条边,即通过N-1条边将N个节点相连,不出现某个节点连多次形成环。

以一个简单的树为例:

相关概念:

        节点的度一个节点含有的子树个数,图例中的根节点1的度为2     

        叶节点(叶子节点):度为0的节点(没有子树的节点),图例中4 8 9  7 

        父节点与子节点:若一个节点含有子节点,那么该节点就是子节点的父节点。

        非终端节点(分支节点):度大于0的节点

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

        节点的层次:从根开始定义其,根节点为第一层,根的子节点为第二次,类推……

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

        节点的祖先:从根到该节点所经分支上的所有节点 例如节点4的祖先是  节点1 2

        森林: 由 m 棵互不相交的树的集合称为森林

2.树的表示

树的存储比较麻烦,并且涉及到可能含有多个子节点,通常采用孩子兄弟表示法

typedef int DataType;
struct Node
 {
      struct Node* firstChild; 
      struct Node* pNextBrother; 
      DataType data; 
 };

二、二叉树

1.二叉树的定义和相关概念

一棵二叉树是节点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵子树(左子树和右子树)的二叉树组成。

特点: 每个节点最多有2个子节点

            二叉树的子树的顺序不能颠倒

2.特殊的二叉树

        ①.满二叉树:一个二叉树,每一层的节点数都达到 2^(n-1) (n为层数 即每层节点数达到最大值),此时总节点数为 2^k-1 (k为树的深度)。

        ②.完全二叉树

       二叉树的深度为 h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。

 3.二叉树的存储结构

 ①顺序存储

     顺序存储就是用数组来存储,但是顺序存储更适用于完全二叉树,不是完全二叉树会存在空间的浪费,而通常只有堆(一个完全二叉树)才会用数组存储。

②链式存储

链式存储是指运用链表存储,用链来表示元素间的关系。链表中每个节点由三个域组成(数据域,左右指针域),左右指针域表示该节点的左右子节点所在链节点的存储地址。另外,还可以由四个域组成,多一个父节点域,存储其父节点所在的地址。

typedef struct tree{
	struct tree *left; // 存左子节点
	struct tree *rigth;// 存右子节点
	int data; // 数据域
}tree;

4.二叉树的性质

        ①若规定根节点的层数为1,则一棵非空二叉树的第 i 层 最多有 2^(i-1)个节点

        ②深度为 h 的二叉树的最大节点数是 2^h-1

        ③对任何一棵二叉树,如果叶子节点的个数为n1,度为2的分支节点为n2 则有n2=n1+1

        ④具有n个节点的满二叉树,其深度为h=log2(n+1)。

参考博文: 数据结构--二叉树--详解_有一棵二叉树,结点编号是1-n每个结点根子树权值和表示结点的个数,-****博客