树叉和树(上)

集合是否相交:例如以下非树

 

树的性质或者依据:

1.子树不相交

2.除了根结点外,每个结点仅有一个父结点;(一个儿一个爹)

3.一棵N个结点的树N-1条边

树的一些术语

1.度--(子)树

2.叶结点:度为0

3.结点的度,树的度,父结点,子结点,兄弟结点,路径和路径长度,祖先结点,子孙结点,结点的层次,树的深度都很好理解

二叉树的定义

有穷结点集合

可以为空,也可以由根节点和(左子树和右子树)组成

 

 

特殊二叉树:

斜二叉树和完美(满)二叉树

 

完全二叉树

有n个结点的一义树,对树甲结点按 从上至下、从左到右顺序进行编号, 编号为i(1≤i≤n)结点与满二叉树 中编号为ⅰ结点在二叉树中位置相同

例如:

 

 

以上是

以下却不是

 

很多数据结构就建立在这种树上

二叉树几个重要性质

1 一个二叉树第i层的最大结点数为:21,i≥1。

2 深度为k的二叉树有最大结点总数为:2k1,k≥1。 1+2+2 3 对任何非空二叉树T,若n,表示叶结点的个数、n2是 度为2的非叶结点个数,那么两者满足关系no=n2+1。

操作集

:BT∈BinTree,ltem∈ElementType,重要操作有: 1、Boolean IsEmpty(BinTree BT):判别BT是否为空; 2、void Traversal(BinTree BT):遍历,按某顺序访问每个结点; 3、BinTree CreatBinTree():创建一个二叉树。

常用的遍历方法有: ◆void PreOrderTraversal(BinTree BT):先序--根、左子树、右子树: ◆void InOrderTraversal(BinTree BT):中序-左子树、根、右子树: ◆void PostOrderTraversal(BinTree BT):后序--左子树、右子树、根 ◆void LevelOrderTraversal(BinTree BT):层次遍历,从上到下、从左到右

二叉树的存储结构

1.顺序存储结构

完全二叉树:从上到下,从左到右顺序存储n结点的完全二叉树的结点父子关系

 

特点:已知其中任何一个结点都能推断出他的子父结点

非根结点(序号i>1)的父结点的序号是Li/2]
    结点(序号为ⅰ)的左孩子结点的序号是2

(若2i<=n,否则没有左孩子); 结点(序号为ⅰ)的右孩子结点的序号是2i+1, (若2i+1<=n,否则没有右孩子);

思考

 

2.链表存储

常用来存储一般的二叉树

二叉树的遍历

四种遍历:先序遍历,中序遍历,后序遍历,

(1)先序遍历 遍历过程为: ①访问根节点 ②先序遍历其左子树: ③先序遍历其右子树

 

 

(2)中序遍历 遍历过程为:

中序遍历其左子树

访问根结点

中序遍历其右子树

 

 

 

 

(3)后序遍历 遍历过程为: 后序遍历其左子树

后序遍历其右子树

访问根结点

 

 

总结

先序、中序和后序遍历过程:遍历过程中经过结点的路线一 样,只是访问各结点的时机不同。

在递归的基础上,递归用堆栈,借助堆栈将递归转换为非递归

 

二叉树的非递归遍历

中序遍历非递归遍历算法 非递归算法实现的基本思路:使用堆栈(待补充,练习堆栈)

 

遇到一个结点,就把它压栈,并去遍历它的左子树: 当左子树遍历结束后,从栈顶弹出这个结点并访问它: )然后按其右指针再去中序遍历该结点的右子树

 

先序遍历的非递归遍历算法

 

请思考后序遍历,如何形成非递归算法?

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白村第一深情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值