c++学习心得2

有关于二叉树,第i层至少1个节点,至多2^(i-1)个节点。所树有i层,则节点最多有2^i-1,最少i个节点。如果每层节点达到最大值,树就被称作完美二叉树或满二叉树。

对于所有的树,要记住一条定理,度为2(就是有两条边)的节点+1等于叶子节点。

另外,二叉树如果从上到下,从左到右编号,也就是层次遍历后,如果一个节点编号乘二>节点数,则那么这个节点没有左孩子,在这个基础上加一大于节点数,那么这个节点就没有右孩子。

关于二叉树的存储结构,可以用顺序存储,也可以用链式存储。我们先介绍顺序存储,下面是代码,

#define maxsize 100

typedef 类型 sq[maxsize]

sq bt;

通过层次遍历确定节点的下标,如果不是满二叉树。则用0代替数组中树中不存在节点的下标,构建成满二叉树。

然后是通过链式存储,下面是格式

struct TNODE{

类型 data;

TNODE *lchild,*rchild ;

}

要了解二叉树就要了解他的遍历方式,可以分为三种,先序遍历,中序遍历,后序遍历

先序遍历的遍历顺序是根-左孩子-右孩子

中序遍历的遍历顺序是左孩子-根-右孩子

后序遍历的遍历顺序是左孩子-右孩子-根

休息每次到左孩子或右孩子时,要考虑是否有左孩子的左孩子,右孩子的右孩子,之后递归遍历。

这几个算法都可以用递归算法实现,下面是递归算法

void lol(bt b){

if(T==nullptr)return 1:

else{

visit(b);  对节点的操作 根

lol(b.lchild); 左

lol(b.rchild); 右

}

}

代码解释:样例代码是先序遍历,第一轮,对第一轮的根节点操作,如果节点有左孩子,进如第二轮,对第二轮的根节点也就是第一轮的左孩子操作,如果第一轮的左孩子没有左孩子,进如第二轮的右孩子,右孩子有,也按照根左右的顺序访问,访问结束返回完成上一轮的根左右访问。

代码把根的代码变换位置就是中序后序遍历。

可以利用这个算法实现二叉树的构建。

假设输入的是先序遍历序列空节点用#代替,把

if(T==nullptr)return 1:

改为

if(T==#)T=nullptr:

visit(b); 

改为

T=new bt:

T.data=ch:

就可以对二叉树构建。

为了利用二叉树空闲的指针,增加两个标志位,ltag和rtag,为一时,把空左指针指向序列前驱,空闲右指针指向序列后继,什么序列就是什么线索二叉树。另外,为了序列第一个和最后一个节点没有前驱后继,增设一个头指针,左指针指向根节点,右指针向遍历的最后一个节点,ltag=0 rtag=1

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值