树和二叉树

树的定义

树是n(n>=0)个结点的有限集,它或为空树(n=0);或非空树,对于非空树来说:
1.有且仅有一个称之为根的结点;
2.除根结点外的其余结点可分为m(m>0)个互不相交的有限集,其中每个集合本身又是一棵树,并且称为根的子树(SubTree).
树

树的基本术语

1.结点:树中的一个独立单元。包含一个数据元素及若干指向其子树的分支;
2.结点的度:结点拥有的子树数称为结点的度;
3.树的度:树的度是树内各结点度的最大值;
4.叶子:度为0的结点称为叶子或终端结点;
5.非终端结点:度不为0的结点称为非终端结点或分支结点
6.双亲和孩子:结点的子树的根称为该结点的孩子,相应的,该结点称为孩子的双亲;
在这里插入图片描述

7.兄弟:同一个双亲的孩子之间互称兄弟;
8.堂兄弟结点:位于同一层的,并且父节点之间是兄弟结点的结点互为堂兄弟结点;
9.祖先和子孙:这个关系就同父亲和孩子一样。从根结点到该结点路径上的所有结点都为该结点的祖先;
10.层次:树是一个递归结构,所以也有层次这种概念,由层次也会引发出树的深度,就好像递归也有深度一样。结点的层次为从结点到根结点的路径中边的条数,并且认为根结点的层次为0,因为根结点到自身的路径中边的条数为0;
11.树的深度:与树的度对应于结点的度一样,树的深度也是选取结点中的最大深度或最大层次,树的深度是一个自顶向下的概念,是从根结点出发,向着叶子结点方向前进的,并且深度这个概念一般只用来描述树,当描述结点的深度时,层次更为恰当,但是用深度也无妨;
12.有序树和无序树:如果将树中结点的各子树看成从左往右是有次序的,则该树称为有序数,否则称为无序树;
13.森林:是n(n>=0)棵互不相交的树的集合,对于树中每个结点而言,其子树的集合即为森林。由此,也可以用森林与树相互递归的定义来描述树。

二叉树

二叉树的定义

二叉树(Binary Tree)是n(n>=0)个数据元素的有限集合,该集合可以为空(空二叉树),也可以由一个称为根(root)的元素及两个不相交的,被分别称为左子树和右子树的二叉树组成。

二叉树的特点

①每个结点最多有两棵子树;
②左子树和右子树是有顺序的,次序不能颠倒(若将其左右子树颠倒,就成为另外一颗不同的二叉树);

二叉树的性质

1.一颗非空二叉树的第i层上最多有2^(i-1)个结点(i>=1);
2.一颗深度为k的二叉树中,最多有2^k-1个结点;
3.对于一颗非空二叉树,如果叶结点数为n0,度数为2的结点数为n2,则有n0=n2+1;
4.具有n个结点的完全二叉树的深度为 |lbn|+1;
5.对于具有n个结点的完全二叉树,如果按照从上到下和从左到右的顺序对二叉树中所有结点从1开始编号,则对于任意序号结点来说,有:
  ①如果i>1,则序号i的结点的双亲结点序号为i/2;如果i=1,则此时结点为根结点,无双亲结点;
  ②如果2i<=n,则序号为i的结点的左孩子为2i;若2i>n,则序号为i的结点无左孩子;
  ③如果2i+1<=n,则序号为i的结点的右孩子为2i+1;如果2i+1>n,则序号为i的结点无右孩子;
  二叉树可以分为完全二叉树和不完全二叉树,满二叉树是完全二叉树的一种特殊形式,如下图:
在这里插入图片描述

二叉树的遍历

先序

若二叉树为空,则空操作;否则:
1.先访问根结点;
2.先序遍历左子树;
3.先序遍历右子树;

中序

若二叉树为空,则空操作;否则:
1.中序遍历左子树;
2.访问根结点;
3.中序遍历右子树;

后序

若二叉树为空,则空操作;否则:
1.中序遍历左子树;
2.中序遍历右子树;
3.访问根结点。

在这里插入图片描述

线索二叉树

二叉树的二叉线索类型定义:

struct binarytree{
	int data;
	struct binarytree *lchild,*rchild;
	int ltag,rtag;
};

在这里插入图片描述
这种结点结构构成的二叉链表作为二叉树的储存结构,叫做线索链表。

孩子兄弟法

struct CSNode{
	int data;
	struct CSNode *firstchild,*nextsibling;
};

在这里插入图片描述

哈夫曼树

哈夫曼树的定义

(1)简单路径长度
所谓树的简单路径长度,是指从树的跟节点到每个节点的路径长度之和。完全二叉树是简单路径长度更小的二叉树。
(2)加权路径长度
所谓树的加权路径长度,是指树中所以带权(非0)叶节点的加权路径长度之和。
(3)哈夫曼树的定义
哈夫曼树又称为最优二叉树。哈夫曼树是指具有相同节点的树中,加权路径长度最小的二叉树。

哈夫曼树的构造

(1)、根据 n 个给定的权值 {w1, w2, …, wn} 构成 n 棵二叉树的集合F={T1, T2, …, Tn},其中每棵二叉树 Ti 中只有一个带权为 wi 的根结点,其左右子树均空;
(2)、在 F 中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和;
(3)、在F中删除这两棵树,同时将新得到的二叉树加入F中;
(4)、重复 (2) 和 (3),直到F中只含一棵树为止,这棵树便是哈夫曼树;

如图所示的3棵二叉树,都含4个叶子结点a,b,c,d,分别带权7、5、2、4,它们的带权路径长度分别为:
在这里插入图片描述
其中以(c)树的最小。可以验证,它恰为哈夫曼树,即其带权路径长度在所有带权为7,5,2,4的四个叶子结点的二叉树中居最小。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值