C语言用后序序列和中序序列生成树,数据结构-第5章学习小结

第五章小结

一、知识框架(如图)

2a879804febb64fb09ccf6a67386abb2.png

二、二叉树重点掌握算法

1. 先序遍历的递归算法

e40cf980bb75bcb8ec52fb28b45d5892.png

a94113ed10b2f3d693a5d1903a09e716.png

voidPreOrderTraverse(BiTree T)

{//先序遍历二叉树

if(T)

{

cout<< T -> data; //访问根结点

PreOrderTraverse(T->lchild); //遍历左子树

PreOrderTraverse(T->rchild); //遍历右子树

}

}

先序遍历

2.中序遍历、后序遍历与先序遍历相似(顺序不同)

先序:根左右; 中序:左根右 ;后序:左右根

3. 先序建立二叉链表

e40cf980bb75bcb8ec52fb28b45d5892.png

a94113ed10b2f3d693a5d1903a09e716.png

void CreateBiTree(BiTree &T)

{//根据读入的先序字符序列,建立二叉树

cin>>ch;if(ch=='#') T = NULL; //递归结束,建空树

else{

T= newBiTNode;

T->data = ch; //生成树(子树)的根结点

CreateBiTree(T->lchild); //递归创建左子树

CreateBiTree(T->rchild); //递归创建右子树

}

}

先序建立二叉链表

4. 先序复制二叉树

e40cf980bb75bcb8ec52fb28b45d5892.png

a94113ed10b2f3d693a5d1903a09e716.png

void Copy(BiTree T, BiTree &NewT)

{//先序复制二叉树

if (T==NULL)

{

NewT=NULL;return;

}//递归结束,建空树

else{

NewT= newBiTNode;

NewT->data = T->data ; //复制根结点

Copy(T->lchild, NewT->Lchild); //复制左子树

Copy(T->rchild, NewT->rchild); //复制右子树

}

}

先序复制二叉树

5. 计算二叉树深度

e40cf980bb75bcb8ec52fb28b45d5892.png

a94113ed10b2f3d693a5d1903a09e716.png

intDepth(BiTree T)

{//返回二叉树的深度

if(T==NULL) return 0; //空树,故深度为0

else{

DepthLeft= Depth(T->lchild); //递归计算左子树的深度

DepthRight = Depth(T->rchild);//递归计算右子树的深度

return (1+max(DepthLeft,DepthRight)); //左右子树中深度大的+1则为二叉树的深度

}

}

返回二叉树的深度

6.计算二叉树结点总数

e40cf980bb75bcb8ec52fb28b45d5892.png

a94113ed10b2f3d693a5d1903a09e716.png

intNodeCount(BiTree T)

{//结点个数为左子树的结点个数+右子树的 结点个数再+1。

if(T==NULL) return 0;else return NodeCount(T->lchild) +NodeCount(T->rchild)+1;

}

计算二叉树结点总数

7.按层次顺序遍历二叉树,输出每个结点的 data 值。【层次遍历过程中采用的辅助数据结构是队列,利用其先进先出的特点来进行层次遍历】

e40cf980bb75bcb8ec52fb28b45d5892.png

a94113ed10b2f3d693a5d1903a09e716.png

typedef structbiTNode

{

TElemType data;struct biTNode *lchild;struct biTNode *rchild;

}BiTNode,*BiTree; //链式二叉树结构体类型

voidfun(BiTree T)

{//层次遍历输出二叉树

queueq;//指向BiTNode类型的指针队列

q.push(T);//T指针入队

BiTNode *p; //辅助变量

while (!q.empty())

{//q非空则继续访问队列

p = q.front(); //取队头

q.pop(); //出队

if (p!=NULL)

{

cout<< p->data;//输出结点data

q.push(p->lchild);//左孩子入队

q.push(p->rchild); //右孩子入队

}

}

}

层次遍历

【给定一棵树,求其最深的叶子结点的编号。测试数据保证只有唯一答案,则利用层次遍历,遍历的最后一个结点即为最深叶子结点】

三、哈夫曼树

1.结点类型定义:

typedef struct{int weight; //权值

intparent, lch, rch;

}*HuffmanTree;

2.例子

1f67f644501c71e5d6de8f76ed4cb891.png

四、二叉搜索树

1.二叉搜索树(递归&非递归)

https://blog.csdn.net/LYJwonderful/article/details/80315438

2. 二叉搜索树的定义、查找、插入和删除

https://blog.csdn.net/yanxiaolx/article/details/51986428

五、易错点

1. typedef TElemType SqBiTree[MAXTSIZE];

// 定义了一个新类型,名字为 SqBiTree,其本质是一个数组,数组元素类型是 TElemType,长度为 MAXTSIZE

如:int a[100]; int b[100] typedef int Num[100] ; Num a,b;

2.int n; cin >>n ; int *a = new int [n] ;//在堆申请空间,长度为 n的int类型数组,语法正确 (人工分配,人工回收)

int n; cin >> n; int a[n] ; //定义数组时,数组长度为变量,C 语言正确,但 C++不支持!(如果可以申请是在栈空间申请)

3.已知

二叉树先序序列、中序序列,求后序序列 或 已知

二叉树后序序列、中序序列,求先序序列

tips :由先序序列可知第一个(由后序序列可知最后一个)为根结点,由中序序列(根结点必在中间)可区分根结点左右子树

eg.若二叉树先序序列:ACBEHDGF,中序序列:BCHEAGFD。则后序序列是?//BHECFGDA

-----> 由先序可知,A 是根结点,再由中序可知,BCHE 是左子树,GFD 是右子树;由先序可知,C 是左子树的根结点,再由中序可知,C 的左孩子为 B,C 的右子树是 HE.....

4.树的同构——给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。所以除了考虑对称同构,与原树相同也是同构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值