数据结构之——树(一)

树定义

树(Tree)是由n个结点组成的有限集合(树中的元素通常称为结点)。n=0的树称为空树;n>0的树T由以下两个条件约定构成:

(1)有一个特殊的结点称为(Root)结点,它只有后继结点,没有前驱结点。

(2)除根节点之外其他结点分为m(-1<m<n)个互不相交的集合T0、T1…Tm-1,其中每个集合也具有树结构,称为根的子树。

树是递归定义的。结点是树的基本单位,若干个结点组成一棵子树,若干互不相交的子树组成一棵树。树中每个结点都是该树中某一棵子树的根。因此,树是由结点组成的、结点之间具有层次关系的非线性结构。

在这里插入图片描述
在上图中,1为树的根节点,其他结点组成两个互不相交的子集T0、T1作为1的子树,
T0=[2,4,5]、T1=[3,6],两棵子树的根节点分别是2、3.

树的术语

下面以上图为例介绍树的术语。

(1)父母、孩子与兄弟结点
一棵树中,一个结点的子树的根节点称为其孩子结点;相对的,该结点是其孩子结点的父母结点。只有根节点没有父母结点,其他结点有且仅有一个父母结点。例如,根节点1没有父母结点,1是2、3的父母结点,2、3是1的孩子结点。

拥有同一个父母结点的多个结点之间称为兄弟结点。例如,2、3是兄弟,4、5也是兄弟,但5和6不是兄弟。

结点的祖先是指其父母结点,以及父母的父母结点等,直到根节点。结点的后代(也称子孙)是指其所有孩子结点,以及孩子的孩子结点等。例如,4的祖先结点有2和1,4是2和1的后代。

(2)度
结点的是结点所拥有的子树的棵树。例如,1的度是2,4的度是0。

度为0的结点称为叶子结点,又称终端结点;树中除叶子结点之外的其他结点称为分支结点,又称非叶结点或非终端结点。例如,4和5是叶子结点,2和3是分支结点。

树的度是指树总各结点度的最大值。例如上图中所示树的度为2.

(3)结点层次、树的高度
结点的层次属性反映结点处于树中的层次位置。约定根结点的层次为1,其他结点的层次是其父母结点的层次加1。显然,兄弟结点的层次相同。例如,1的层次为1,2的层次为2,4的层次为3。5、6不是兄弟,称为同一层上的结点。

树的高度深度是树中结点的最大层次树。例如上图所示树的高度为3。

(4)边、路径、直径
设树中X结点是Y结点的父母结点,有序对(X,Y)称为连接这两个结点的分支,也称为。例如,1、2结点之间的边是(1,2)。

设(X0,X1…,Xk)(-1<k<n)是由树中结点组成的一个序列,且(Xi,Xi+1)(-1<i<k)都是树中的边,则称该序列为从X0到Xk的一条路径路径长度为路径上的边数。例如,从1到4的路径是(1,2,4),路径长度为2。

二叉树的直径指从根到叶子结点一条最长路径,直径的路径长度是该二叉树的高度-1。

(5)无序树、有序树
在树的定义中,结点的子树T0、T1。。。Tm-1之间没有次序,可以交换位置,称为无序树,简称树。如果结点的子树从左到右是有次序的,不能交换位置,则称为有序树

A
/ \
B C

A
/
C B

如上面两课树如果表示同一棵树,这就叫无序树,如果表示2棵不同的树,就叫有序树,也就是说结点的位置是否对树的构成有关。

(6)森林
森林是m棵互不相交的树的集合。给森林加上一个根结点就变成一棵树,将树的根节点删除就变成森林。

树抽象数据类型

树的操作主要有创建树、获得父母/孩子/兄弟结点、遍历、插入和删除等。声明树抽象数据类型Tree< T >如下,其中T表示结点的元素类型,TreeNode< T >是树结点类。结点类将在后面博客中写写到。

public interface Tree<T> {
	boolean isEmpty();	//判断是否空树
	int level(T key);	//返回关键字为key结点所在的层次
	int size();			//返回树的结点数
	int height();		//返回树的高度
	void preorder();	//输出树的先根次序遍历序列
	void postorder();	//输出树的后根次序遍历序列
	void levelorder();	//输出树的层次遍历序列
	TreeNode<T> insertRoot(T x);		//插入元素x作为根节点并返回
	TreeNode<T> insertChild(TreeNode<T> p,T x,int i)		//插入x作为p结点的第i个孩子
	void remove(TreeNode<T> p,int i);		//删除p结点的第i棵子树
	void clear();		//删除树的全部结点
	TreeNode<T> search(T key);		//先根次序遍历查找首个关键字为key的结点
	boolean contains(T key);		//判断是否包含关键字为key的元素
	T remove(T key);		//删除以key结点为根的子树

}

二叉树定义

二叉树(Binary Tree)是n个结点组成的有限集合,n=0时称为空二叉树;n>0时的二叉树由一个根结点和两棵互不相交的、分别称为左子树和右子树的子二叉树构成。二叉树也是递归定义的。在树中定义的度、层次等术语,适用于二叉树。

在这里插入图片描述
二叉树有五种基本形态:如上图所示

1.空二叉树就是什么也没有(null)
2.只有一个根
3.只有左子树,没有右子树
4.只有右子树,没有左子树
5.左右都有,如图

二叉树性质

在这里插入图片描述
全是公式,通过找规律推导的。我们可以直接记忆。注意深度即为高度,终端结点即叶子结点。

满二叉树和完全二叉树

满二叉树:
在这里插入图片描述
如图中,这个树有四层,它的四层全部都得是满的。所以它叫满二叉树。
如果有n层,它的n层全部都得是满的。

完全二叉树:
在这里插入图片描述
每一行必须是从左往右依次排开。
规律如下:
在这里插入图片描述

二叉树的遍历规则

在这里插入图片描述
1.前序遍历
在这里插入图片描述
前序遍历DLR,D–>根结点,L–>根的左子树的结点,R–>根的右子树的结点
从根结点开始,每个结点都按DLR的顺序进行判断。

前序遍历:也叫做先根次序,即访问根节点,遍历左子树,遍历右子树。

2.中序遍历
在这里插入图片描述
中序遍历LDR,L–>根的左子树的结点,D–>根结点,R–>根的右子树的结点
从根结点开始,每个结点都按LDR的顺序进行判断。
如图中的树,如果A在中序遍历的最前面,说明此树无左子树
如果A在中序遍历的最后面,说明此树无右子树

中序遍历:也叫中根次序,即遍历左子树,访问根结点,遍历右子树。

3.后续遍历
在这里插入图片描述
后序遍历LRD,L–>根的左子树的结点,R–>根的右子树的结点,D–>根结点
从根结点开始,每个结点都按LRD的顺序进行判断。

后序遍历:也叫做后根次序,即遍历左子树,遍历右子树,访问根结点。

4.层序遍历
在这里插入图片描述
层序遍历是逐层从左到右遍历

1.深优一般基于栈实现,广优一般基于队列实现
2.前序和后序推不出一颗唯一的二叉树。

栈实现中序遍历:
1.从根结点开始,把根结点的左孩子和该孩子的左孩子(一直是左孩子)…
(最左边的一排)全部进栈,一直到左边树没有下一个结点为止。
2.开始出栈,如果栈顶结点没有左,没有右,出栈它自己。
否则先出栈它自己,然后把它右孩子和该右孩子的所有左边进栈。然后再出栈。
3.出栈的顺序就是遍历的顺序

队列实现层序遍历:
1.根结点开始进队列
2.根结点出队,把根结点的左右孩子进队,再出队
3.其他结点一样,把该结点的左右孩子进队,再出队
4.队列出队的顺序就是层序遍历的顺序

二叉树的存储结构

二叉树主要采用链式存储结构,顺序存储结构仅使用于完全二叉树(满二叉树)。

1.二叉树的顺序存储结构
在这里插入图片描述
用树的最高高度-树的最低高度不能大于1,这样的树就称为平衡二叉树。

2.二叉树的链式存储结构
在这里插入图片描述
除了完全二叉树、平衡二叉树或者满二叉树,其他的一般都用链式存储结构。

今天就先学习到这里,后面的再慢慢的补充

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值