浅谈树与图

二叉树

二叉树的概念和特点

二叉树的递归定义:二叉树为空树,或是由一个根节点加上两棵分别为称为左子树和右子树的互不交的二叉树组成。

左子树
左子树
右子树
右子树
左子树
右子树
A
B
D
E
C
F
G

二叉树的特点:1、每个节点最多只有两棵子树,及不存在结点读大于2的结点; 2、子树有左右之分,不能颠倒。

1
2
3
4
1
2
3
4
1
2
3
4
线性结构树型结构
第一个元素(无前驱)根结点(无前驱)
最后一个数据元素(五后继)多个叶子结点(无后继)
其他元素(一个前驱,一个后继)其他元素(一个前驱,多个后继)

两类特殊的二叉树

满二叉树:

1
2
3
4
5
6
7
8
9
12
13
14
15

完全二叉树:

a
b
c
d
e
h
i
j
f
g

二叉树的存储

二叉树的存储结构

二叉树的顺序存储

完全二叉树的存储选择用一组地址连续的储存单元,以层序顺序存储,如:

a
b
c
d
e
h
i
j
f
g
abcdefghij
12345678910

但是当碰到一般交叉树时该怎么存储呢,我们的解决方案是把一般的的二叉树先补成完全二叉树,然后按照完全二叉树的顺序存储方式进行存储,而新补上去的地方只占位置,不存放结点数据。

A
B
C
G
D
K
F
E
H
I
J
ABCDEFGHIJK
1235611
二叉树的链式存储

问题:顺着某一条搜索路径寻访二叉树中的结点,是的每个节点均被访问一次,而且仅被访问一次。

A
B
D
C

链式存储用于遍历,常用的遍历方法有:
递归遍历、层次遍历和非递归遍历。
这里介绍递归遍历的三种方法(不会画图,就意想一下哈):
1、先序遍历算法:若二叉树为空,则先方问根结点,线序遍历左子树,先序遍历右子树。
先序遍历序列:A B D C
2、中序遍历算法: 若二叉树为空,则先中序遍历左子树,访问根结点,中序遍历右子树。
中序遍历算法:B D A C
3、后序遍历算法, 若二叉树为空,则先后序遍历左子树,后序遍历右子树,访问根结点。
后序遍历算法: D B C A

图是常用的重要的一类数据结构,上一章的树可以看成是图的特例,
树中每个数据元素至多允许一个前驱,只能反映数据元素之间一对
多的关系,而图中没有该限制,允许数据元素可以有多个前驱,因
此可以反映数据元素之间多对多的关系。

图的种类

有向图

A
B
C

无向图

A
B
C

其实说白了就是一个有方向一个没有方向。。。

图的遍历

深度优先算法

基本思想:
数据 I.访问出发点”;
结构 Ⅱ.依次以v的未被访问的邻接点为出发点,与算 深度优先搜索图,直至图中所有与,有法路径相通的顶点都被访问。对于非连通图,则图中一定还有顶点未被访
问,要从图中另选一个未被访问的顶点作为起始点,重复上述深度优先搜索过程。
例如:

A
B
C
D
E
F
G
H
I

按照序号查找依次为:A B C F G D H I
像啊哈书上的思想:

void dfs(int step)
{
判断边界
尝试每一种可能 for (i=1;i<n;i++)
{
继续下一步 dfs(step+1);
}
返回
}

这就是dfs核心思想。但是还有一些地方还是没能参悟,和图一起下个星期再好好学习!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值