学习笔记:树和二叉树的初步学习1

树是以分支关系定义的层次结构。

一、树的定义

树是n个结点的有限集。在任意一棵非空树中,有且仅有一个特定的被称为根的结点;当n>1时,其余结点可分为m(m>0)个互不相交的有限集,其中每一个集合本身又是一棵树,并且称为根的子树。树有许多基本操作,如求树深,为结点赋值,求双亲、孩子结点,遍历并对每个结点调用函数等。

树的结构定义是一个递归的定义,即在树的定义中又用到树的概念,它道出了树的固有特性。一般说来,分等级的分类方案都可导致一个树结构。

二、二叉树

1、定义

二叉树的每个结点至多只有两棵子树,并且子树有左右之分。抽象数据类型二叉树的基本操作可概括为查找、插入、删除。

2、性质

书上的五个性质

最后两个性质是完全二叉树的。完全二叉树和满二叉树是两种特殊形态的树。一棵深度为k的且有(2^k)-1个结点的二叉树称为满二叉树。对满二叉树的结点进行自上而下、自左至右的连续编号。则完全二叉树是,深度为k的,有n个结点,当且仅当其每个结点都与深度为k的满二叉树中编号从1至n的结点一一对应的二叉树。

3、存储结构

a.顺序存储结构

#define MAX_TREE_SIZE 100
typedef 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指示不同信息时有不同值。

对二叉树以某种次序遍历使其变为线索二叉树的过程叫做线索化。

某程序中所用二叉树需经常遍历或查找结点在遍历所得线性序列中的前驱和后继,则应采用线索链表作存储结构。


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值