非线性数据结构——树与二叉树的相关内容

一、定义

树(Tree)是n(n≥0)个结点的有限集T,其中:有且仅有一个特定的结点,称为树的根(Root);

当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,……Tm,其中每一个集合本身又是一棵树,称为根的子树(SubTree)。

二、特点

(1)树中至少有一个结点——根

(2)树中各子树是互不相交的集合

三、基本术语

结点(Node)——表示树中的元素,包括数据项及若干指向其子树的分支;

结点的度(Degree)——结点拥有的子树数;

叶子(Leaf)——度为0的结点;

孩子(Child)——结点子树的根称为该结点的孩子;

双亲(Parents)——孩子结点的上层结点叫该结点的~

兄弟(Sibling)——同一双亲的孩子;

树的度——一棵树中最大的结点度数;

结点的层次(Level)——从根结点算起,根为第一层,它的孩子为第二层……;

深度(Depth)——树中结点的最大层次数;

森林(Forest)——m(m≥0)棵互不相交的树的集合;

四、二叉树的定义

定义:
二叉树是n(n≥0)个结点的有限集,它或为空树(n=0),或由一个根结点和两棵分别称为左子树和右子树的互不相交的二叉树构成。

特点:
(1)每个结点至多有二棵子树(即不存在度大于2的结点)

(2)二叉树的子树有左、右之分,且其次序不能任意颠倒

一般树与二叉树的区别:

五、二叉树的性质

性质1: 在二叉树的第i层上至多有2i-1个结点,第i层上至少有1个结点。
性质2: 深度为k的二叉树至多有2k-1个结点,深度为k时至少有k个结点。
性质3: 对于任何一棵二叉树,若2度的结点数有n2个,则叶子数n0必定为n2+1 (即n0=n2+1)
特殊形态的二叉树
满二叉树: 一棵深度为k 且有2k -1个结点的二叉树。
(特点:每层都“充满”了结点)
完全二叉树: 深度为k 的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k 的满二叉树中编号从1至n的结点一一对应
在这里插入图片描述
满二叉树是叶子一个也不少的树,而完全二叉树虽然前n-1层是满的,但最底层却允许在右边缺少连续若干个结点。满二叉树是完全二叉树的一个特例。
性质4: 具有n个结点的完全二叉树的深度必为[log2n]+1。
2k−1−1<n≤2k−1 或 2k−1≤n<2k
k−1≤log2n<k,因为k是整数
所以k = log2n(取下整) + 1
性质5: 对完全二叉树,若从上至下、从左至右编号,则编号为i 的结点,其左孩子编号必为2i,其右孩子编号必为2i+1;其双亲的编号必为i/2(取下整)。

六、二叉树的存储结构

顺序存储结构
实现:按完全二叉树的结点层次编号,依次存放二叉树中的数据元素
特点:
(1)结点间关系蕴含在其存储位置中
(2)浪费空间,适于存满二叉树和完全二叉树
链式存储结构
二叉链表:在n个结点的二叉链表中,有n+1个空指针域
(实验采用此方式)

typedef struct BiNode
{    
	datatype data;
	struct BiNode *lchild, *rchild;
} BiNode,*BiTree;

三叉链表:方便找双亲
在n个结点的三叉链表中,3*n个指针域,有效的(n-1+n-1)

typedef struct node
{   
	datatype data;
    struct node *lchild, *rchild, *parent;
};

七、二叉树的遍历

①先序( 根)遍历DLR
②中序( 根)遍历LDR
③后序( 根)遍历LRD

//先序遍历构造二叉树
BiTree creatBiTree(BiTree T) 
{
	char ch;
	scanf("%c",&ch);
	if(ch=='#') T=NULL;
	else
	{
          T=(BitNode *)malloc(sizeof(BitNode));
          T->data=ch;
          T->lchild=creatBiTree(T->lchild);
          T->rchild=creatBiTree(T->rchild);
	}
	return T;
}
void InorderTraverse(BiTree T)  //中序遍历
{
	if(T!=NULL)
	{
		InorderTraverse(T->lchild);
		printf("%2c",T->data);
	    InorderTraverse(T->rchild);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值