C语言 二叉树详解(自我理解版)!!!二叉树的实现
目录
1.树的概念和结构(了解)
1.1树的概念
对于树来说,树并不是线性的,它是由n个节点(n>=0)组成的一种具有层次的结构。
对于树这个结构来说,这个结构很像是一棵倒着的树,所以名字就叫做树。
?这是一个高度为4的树,可以看出这个树A这个节点只有一个,这个节点叫做根节点。就很像树杆
1.2关于树的每个组成结构的叫法
节点的度 :一个节点含有的子树的个数称为该节点的度; 如上图: A 的为3叶节点或终端节点 :度为 0 的节点称为叶节点; 如上图:K L F G M I J? 节点为叶节点非终端节点或分支节点 :度不为 0 的节点; 如上图:B C D E H? 节点为分支节点双亲节点或父节点 :若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图: A 是 B 的父节点孩子节点或子节点 :一个节点含有的子树的根节点称为该节点的子节点; 如上图: B 是 A 的孩子节点兄弟节点 :具有相同父节点的节点互称为兄弟节点; 如上图: B?? C? D 是兄弟节点树的度 :一棵树中,最大的节点的度称为树的度; 如上图:树的度为3, A 和 D 的度都是3节点的层次 :从根开始定义起,根为第 1 层,根的子节点为第 2 层,以此类推;树的高度或深度 :树中节点的最大层次; 如上图:树的高度为 4堂兄弟节点 :双亲在同一层的节点互为堂兄弟;如上图: H?? I? J? 互为兄弟节点节点的祖先 :从根到该节点所经分支上的所有节点;如上图: A 是所有节点的祖先子孙 :以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是 A 的子孙森林 :由 m ( m>0 )棵互不相交的树的集合称为森林;
1.3树的结构体表示
typedef int DataType;
struct Node
{
struct Node* _firstChild1; // 第一个孩子结点
struct Node* _pNextBrother; // 指向其下一个兄弟结点
DataType _data; // 结点中的数据域
};
这是一棵树的结构体内容,一般一棵树的存储内容就是,孩子节点和兄弟节点的指针,之后就是这个节点存放的值 元素。
1.4树在实际中的运用?
这是一棵表示文件目录系统的树。?
2.二叉树的概念和结构和实现(本期偏重点之一)
? 二叉树的概念
?二叉树是一个集合,这个集合要么为空,要么就是一个根节点,要么就是根节点的下面有左子树和右子树(其中一个可以为空)。
由这张图可以看出,二叉树每个结点的度(就是子节点的个数)一定小于?2。
二叉树有左树和右树之分,如果在一个数组里面,左树的数据是在右树前面的,次序不能颠倒,因为二叉树是有序的。
?特殊的二叉树
1.完全二叉树
如图这是一个完全二叉树,完全二叉树与普通二叉树之间的差别在于,完全二叉树 的每一个子节点必须先有左边的子节点,才能有右边的子节点。直到一层塞满,再放下一层
2.满二叉树(完全二叉树的特殊情况)
如图这是一个满二叉树,他就是一个完全二叉树,完全二叉树每层都塞满的时候,就是一个满二叉树
?关于一部分二叉树的性质(可以用来做题)
1. 若规定根节点的层数为 1 ,则一棵非空二叉树的 第 i 层上最多有 2的(i - 1)次方个结点.2. 若规定根节点的层数为 1 ,则 深度为 h 的二叉树的最大结点数是? 2 的 h 次方 - 1.3. 对任何一棵二叉树 , 如果度为 0 其叶结点个数为n0 , 度为 2 的分支结点个数为n0 - 1? , 则有n0 =n2?+ 14. 若规定根节点的层数为 1 ,具有 n 个结点的满二叉树的深度 , h=log n+1. (ps : 是log 以 2 为底,n+1 为对数 )5. 对于具有 n 个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从 0 开始编号,则对 于序号为i 的结点有:1. 若 i>0 , i 位置节点的双亲序号: (i-1)/2 ; i=0 , i 为根节点编号,无双亲节点2. 若 2i+1<n ,左孩子序号: 2i+1 , 2i+1>=n 否则无左孩子3. 若 2i+2<n ,右孩子序号: 2i+2 , 2i+2>=n 否则无右孩子
关于二叉树的储存结构?
二叉树既可以用 顺序表的结构类型来进行存储,也可用链表的结构类型进行存储。
1.顺序结构
顺序结构的意思就是用数组进行存储,在物理结构储存上就是连续的。
但一般使用数组表示的话基本都是完全二叉树,因为必须保持有序,如果不是完全二叉树就会出现空间浪费的情况。(就如果J 是 E的右节点的话,那E的左节点就没有数据就浪费了一个空间)这里的父节点和子节点的计算可用 公式 child = parent / 2? + 1 (左节点)或 + 2(右节点).。
?
2.二叉树的链式储存,即把二叉树的节点以链表的结构进行存储。?这里的父亲节点里就得存储 左右两个子节点的指针。
当然既然是链式结构,上面的顺序结构可以找到父亲节点,那链式结构也有办法找到父节点,这就要用的三个指针的结构体,左右孩子节点,再加上父亲节点的指针。叫三叉链表?!
typedef int BTDataType;
// 二叉链
struct BinaryTreeNode
{
struct BinTreeNode* _pLeft; // 指向当前节点左孩子
struct BinTreeNode* _pRight; // 指向当前节点右孩子
BTDataType _data; // 当前节点值域
}
// 三叉链
struct BinaryTreeNode
{
struct BinTreeNode* _pParent; // 指向当前节点的双亲
struct BinTreeNode* _pLeft; // 指向当前节点左孩子
struct BinTreeNode* _pRight; // 指向当前节点右孩子
BTDataType _data; // 当前节点值域
};
这是两种链表的结构体存储内容。?
二叉树的实现放到下一章。?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!