学习笔记:树和二叉树的初步学习1
来源:互联网 发布:刘备是汉室宗亲吗 知乎 编辑:程序博客网 时间:2024/09/21 08:58
树是以分支关系定义的层次结构。
一、树的定义
树是n个结点的有限集。在任意一棵非空树中,有且仅有一个特定的被称为根的结点;当n>1时,其余结点可分为m(m>0)个互不相交的有限集,其中每一个集合本身又是一棵树,并且称为根的子树。树有许多基本操作,如求树深,为结点赋值,求双亲、孩子结点,遍历并对每个结点调用函数等。
树的结构定义是一个递归的定义,即在树的定义中又用到树的概念,它道出了树的固有特性。一般说来,分等级的分类方案都可导致一个树结构。
二、二叉树
1、定义
二叉树的每个结点至多只有两棵子树,并且子树有左右之分。抽象数据类型二叉树的基本操作可概括为查找、插入、删除。
2、性质
书上的五个性质
最后两个性质是完全二叉树的。完全二叉树和满二叉树是两种特殊形态的树。一棵深度为k的且有(2^k)-1个结点的二叉树称为满二叉树。对满二叉树的结点进行自上而下、自左至右的连续编号。则完全二叉树是,深度为k的,有n个结点,当且仅当其每个结点都与深度为k的满二叉树中编号从1至n的结点一一对应的二叉树。
3、存储结构
a.顺序存储结构
#define MAX_TREE_SIZE 100typedef TElemType SqBiTree[MAX_TREE_SIZE];SqBiTree bt;
用一组地址连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素。这种存储结构仅适用于完全二叉树。
b.链式存储结构
可以根据需要设计不同的结点结构,进而构成不同的链式存储结构。如果仅有数据域,左、右指针域,构成的二叉树存储结构称为二叉链表;加上一个双亲域指示其双亲,这样的结点结构构成二叉树称为三叉链表。
链表的头指针指向二叉树的根结点。
typedef struct BiTNode{TElemType data;struct BiTNode *lchild,*rchild;//左右孩子指针}BiTNode,*BiTree;
4、遍历二叉树
由二叉树的递归定义知,二叉树又三个基本单元组成,即根结点,左子树和右子树。如果按不同次序遍历这三个部分,就可遍历整个二叉树。按遍历次序不同形成三种遍历方式:先序遍历,中序遍历和后序遍历。
先序遍历二叉树的递归算法:
Status PreOrderTraverse(BiTree T,Status(*Visit)(TElemType e)){//采用二叉链表存储结构,Visit是对数据元素操作的应用函数,如输出结点值if(T){<span style="color:#ff0000;">if(Visit(T->data))if(PreOrderTraverse(T->lchild,Visit))if(PreOrderTraverse(T->rchild,Visit))</span>//每一层递归,从左孩子到右孩子return OK; return ERROR;}else return OK;}
中序遍历和后序遍历只需要调换红色字体代码的顺序就行了。
如果不看和递归无关的visit语句,则这三个遍历算法完全相同。
由此,从递归执行过程来看,这三种遍历是完全相同的。
二叉树的遍历是最重要的内容,是二叉树各种操作的基础,也是树和森林各种操作的基础,因为它们可以转化为二叉树的形式,它们的操作也可以转化为对二叉树的操作。
按不同顺序生成的序列可以建立二叉树的存储结构。
下面的算法是按先序序列建立二叉链表,结点的值为一个字符,空格表示空树:
Status CreateBiTree(BiTree *T){scanf(&ch);if(ch==' ')T=NULL;else{if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))return OVERFLOW;T->data=ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);//<span style="color:#ff0000;">按定义理解,同一层递归要做两件事,依次是左子树和右子树</span>}return OK;}
5、线索二叉树
当以二叉链表存储结点时,只能找到结点的左右孩子,而无法直接得到结点在任意遍历序列中的前驱和后继信息,只有在遍历的动态过程才能得到。
在有n个结点的二叉链表中存在n+1个空指针,设法用这些指针存储结点的前驱和后继信息。
增加两个标识域LTag,RTag,在lchild和rchild指示不同信息时有不同值。
对二叉树以某种次序遍历使其变为线索二叉树的过程叫做线索化。
某程序中所用二叉树需经常遍历或查找结点在遍历所得线性序列中的前驱和后继,则应采用线索链表作存储结构。
- 学习笔记:树和二叉树的初步学习1
- 学习笔记:树和二叉树的初步学习2
- 数据结构与算法学习笔记——二叉树的初步理解
- 【算法学习笔记】08.数据结构基础 二叉树初步练习1
- 对二叉树的初步学习之递归的应用
- 二叉树学习笔记
- 二叉树学习笔记
- 二叉树学习笔记
- 二叉树学习笔记
- 二叉树学习笔记
- 学习笔记-二叉树
- 学习笔记 二叉树
- 树的初步学习
- 二叉树学习笔记-深度和宽度
- [学习笔记]二叉树的线索化和遍历
- 【算法学习笔记】09.数据结构基础 二叉树初步练习2
- 【算法学习笔记】10.数据结构基础 二叉树初步练习3(遍历与递归复习)
- 【算法学习笔记】11.数据结构基础 二叉树初步练习4
- 浅谈并发服务器---多进程并发---3
- C语言宏定义技巧(常用宏定义)
- Intel 100系芯片组PCIE Lane分配图
- 通过spring-data-redis完成LINDEX, LLEN, LPOP, LPUSH, LRANGE, LREM, LSET, LTRIM, RPOP, RPUSH命令
- 算法竞赛入门经典课后习题2
- 学习笔记:树和二叉树的初步学习1
- linux 下的c 文件操作
- 网络进程间通信函数一
- 程序员必读的书籍
- Logic java 第二章
- Android Studio如何集成Genymotion
- Winform 移植到 WPF 中 窗体变丑 解决方案
- 《深度学习C++对象模型》学习笔记2:构造函数语意学
- 使用 Timer 进行任务调度