数据结构基础学习笔记(三)树

前边的数据结构都是一对以的关系,而树是一种一对多的关系。
树的定义方法也是很有意思的,是一种递归的定义方法,就是套娃,树的定义里又用了树的定义。树的定义是这样的:
树是n个节点的有限集,当n=0时,称为空树,非空树满足:
1)有且仅有一个为根的结点
2)其余结点可分为m个不相交的有限集,每个集合本身也是一棵树,称为根的子树。
树是一种逻辑结构,我们可以根据树的定义得到树的一些特点,比如说,除了根结点外,所有结点有且只有一个前驱,但是可以有零个或多个后继,因为是一对多的关系。
树是分层的数据结构。
在这里插入图片描述

这是一个四层的树,所以这颗树的高度为4。
从根结点到一个结点的唯一路径上的任意一个结点,都叫做这个结点的祖先结点,比如说G结点,A结点到G结点的路径是ABDG,那B结点就可以说是G结点的祖先,G就是B的子孙。这条路径上与G最相邻的上一个结点D叫做G的双亲,那G自然就是D的孩子结点,有的结点有很多个孩子结点,比如B就有D和E两个孩子结点,D和E有相同的双亲,那D和E就是兄弟结点,G和H也是兄弟。
一个结点的孩子数量称为结点的度,比如说B,D的度为2,C的度为1,F的度为0。所以结点的最大度树就是这个树的度。图中的这个树度数就是2,结点最大的度就是2。
这些有孩子的结点,或者说度大于0的结点称为分支结点,,有时候也叫非终端结点,因为还有孩子,所以不是终端,而那些度为0的结点,叫叶子结点,也可以叫终端结点。但是我觉得还是分支结点和叶子结点比较顺口。
D和E的双亲和F的双亲是兄弟,那D,E,和F也应该是有血缘关系的,所以D,E和F互为堂兄弟。
还有一个定义叫深度和高度,分别是从不同方向来看的,一个结点的深度是从根结点自顶向下累加,一个结点的高度是从叶结点自底向上累加,至于说树,高度深度都是一样了,就看这个树一共有多少层了,但是这个地方有很多地方描述的不一样,有的书上认为根结点在第0层,有的认为根结点在第1层,这个就看怎么定义的了。
树还分有序树和无序树,顾名思义,有序树就是位置确定的树,左右孩子结点是不可以换位置的,换了位置就不是同一颗树了,无序树就是从左到右是没有顺序的,比如说这个G和H可以交换位置,交换之后根以前还是相同的树。
树中的两个结点之间的路径就是说从这个结点到另一个结点需要经过哪些结点,经过的边的个数就是路径长度。
还有一个概念叫森林,这个也很容易理解,就是很多棵树,把一棵树的根结点去掉就成了森林。比如像这样。
在这里插入图片描述
树的结点树等于所有的结点的度数加1。
这个是为什么,度数就相当于是上一个结点的分支对不对,但是这样的话根结点没有算在里面,所以要所有结点的度数加1。
二叉树是个很重要的一种树形结构,简单来说就是每个结点最多只能有两棵子树,因为是二叉,而且二叉树是有顺序的,所以它的左右子树不能随便交换。
下面说几个比较特殊的二叉树,第一个是满二叉树。
在这里插入图片描述
满二叉树,顾名思义,就是每一层都是满的,它的叶子结点都在最下面那一层,除了叶子结点,每个结点都有两个孩子结点。一颗高度为h的二叉树一共有2^h - 1个结点。比如说这个树,一共有四层,2的四次方减1,二的四次方是16,减1,是15个。
还有一种树叫完全二叉树,完全二叉树不一定是满的,但是它只要存在的点都和已有的满二叉树对应。
比如说这个就是一个完全二叉树。
在这里插入图片描述
但是如果最后一个叶子结点在右边,就不是。
还有一种二叉树叫二叉排序树,是排序用的。二叉排序树的特点是左子树上所有的关键点都比根结点的关键字小,右子树的所有关键子都比根结点大。至于左右子树,也满足这个条件。
还有一种树叫平衡二叉树,平衡二叉树指的是树上任一结点的左右子树的深度的差都不会超过1。
下面讲一下二叉树的遍历,二叉树的遍历一般分为四种,前序遍历,中序遍历、后序遍历和层次遍历。
这里的前中后序的序是指的跟结点的访问次序。
前序遍历是先访问根结点,然后遍历左子树,然后遍历右子树。同样它们的左右子树也是按照这个顺序遍历。
中序遍历是先中序遍历根结点的左子树,然后访问根结点,最后是中序遍历右子树。
后序遍历就是最后遍历根结点。
层次遍历就比较简单了,就是按层从左到右依次访问。
有的时候我们需要将树转换成二叉树方便处理。
转换的步骤是什么呢。
首先在所有兄弟结点之间加一条线,然后对每个结点,只留下它与第一个孩子的连线。然后每个结点的第一个孩子是左孩子,兄弟结点变成自己的右孩子。
那森林怎么转换成二叉树呢,先把每棵树按前面的规则转换为二叉树,而且我们已经知道,按照上面的规则转换成的二叉树的二叉树右子树一定是空的,所以第二棵树构成的二叉树可以作为第一棵树构成的二叉树的右子树,同理,第三棵可以作为第二棵的右子树,以此类推,森林就构成了二叉树。
最后讲一下哈夫曼树。
要知道什么是哈夫曼树,首先要知道一个概念,就是权。在很多时候,结点会被赋予一个表示某种意义的数值,从树的根结点到任意结点经过的边数乘以权值,称为该结点的带权路径长度,所有结点的带权路径长度之和称为该树的带权路径长度。
在含有n个带权叶结点的二叉树中,带权路径长度最小的二叉树称为哈夫曼树。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值