数据结构|4.树

一.定义一棵树

//双亲表示法 
#define MAX_TREE_SIZE 100
typedef int TElemType;  //树结点数据类型暂定为整型 
typedef struct PTNode{//定义结点 
	TElemType data;
	int parent;
}PTnode;
typedef struct{//树结构 
	PTNode nodes[MAX_TREE_SIZE];//结点数组 
	int r,n;//根的位置以及结点数 
}PTree;



//孩子表示法
#define MAX_TREE_SIZE 100
typedef struct CTNode{//孩子结点 
	int child;
	struct CTNode *next;
}*ChildPtr;
typedef struct{//表头结构 
	TElemType data;
	ChildPtr firstchild;
}CTBox;
typedef struct{//树结构 
	CTBox nodes[MAX_TREE_SIZE];//结点数组 
	int r,n;//根的位置以及结点数 
}CTree; 

二. 二叉树

定义:二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个结点。

完全二叉树:对一颗具有n个结点的二叉树按层序编号,如果编号为i的结点0与同样深度的满二叉树中编号为i的结点在二叉树中的位置完全相同,则称为完全二叉树。

度:结点拥有的子树数称为结点的度。度为0的结点称为叶子结点或终端结点。

(编号连续) 

特点:

(1)叶子结点只能出现在最下两层。
(2)最下层的叶子一定集中在左部连续位置。
(3)倒数二层,若有叶子结点,一定都在右部连续位置。
(4)如果结点度为1,则该结点只有左孩子,即不存在只有右子树的情况。
(5)同样结点数的二叉树,完全二叉树的深度最小。

性质:

(1)在二叉树第i层上至多有2^{i-1}​个结点(i\geqslant 1​)
(2)深度为k的二叉树至多有2^{k}-1个结点
(3)对任何一颗二叉树T,其终端结点数为n0,度为2的结点数为n2,则n0=n2+1;设度为1的结点数为n1,则树的节点总数n=n0+n1+n2
(4)具有n个结点的完全二叉树的深度为[log_{2}n]+1,(其中[x]表示为不大于x的最大整数)
(5)如果对一棵有n个结点的完全二叉树(其深度为[log_{2}n]+1)的结点按层序编号(从第1层到第[log_{2}n]+1层,每层从左到右),对任一结点 i 有:

  • 如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲是结点[i/2]。
  • 如果2i>n,则结点1无左孩子(结点i为叶子结点);否则其左孩子是结点2i
  • 如果2i+1>n,则结点i无右孩子;否则其右孩子是结点2i+1

 三.遍历二叉树

链表结点结构定义

typedef struct BiTNode{//结点结构 
	TElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

遍历二叉树

(1)前序遍历

根结点——左子树——右子树

ABDGHCEIF

void PreOrderTraverse(BiTree T){
	if(T==null)
		return;
	print("%c",T->data);//此步骤可换 
	PreOrderTraverse(T->lchild);//先遍历左子树 
	PreOrderTraverse(T->rchild);//再遍历右子树 	
} 

(2)中序遍历

左子树——根结点——右子树

GDHBAEICF

void InOrderTraverse(BiTree T){
	if(T==null)
		return;
	InOrderTraverse(T->lchild);//先遍历左子树 
	print("%c",T->data);//此步骤可换 
	InOrderTraverse(T->rchild);//再遍历右子树 	
} 

(3)后序遍历

从左到右先叶子后结点遍历左右子树——根结点

GHDBIEFCA

void PostOrderTraverse(BiTree T){
	if(T==null)
		return;
	PostOrderTraverse(T->lchild);//先遍历左子树 
	PostOrderTraverse(T->rchild);//再遍历右子树 
	print("%c",T->data);//此步骤可换 	
} 

(4)层序遍历

根结点开始从上向下逐层遍历

ABCDEFGHI

*已知前序,中序可以确定唯一一棵二叉树;已知后序,中序可以确定唯一一棵二叉树;已知前序,后序不可以确定唯一一棵二叉树

四.建立二叉树

void CreateBiTree(BiTree *T){
	TElemType ch;
	scanf("%c",&ch);
	if(ch=='#')
		*T=NULL;
	else{
		*T=(BiTree)malloc (sizeof(BiTree));
		if(!*T)
			exit(OVERFLOW);
			(*T)->data=ch;
			CreateBiTree(&(*T)->lchild);
			CreateBiTree(&(*T)->rchild);//以前序举例 
	}
}

输入AB#D##C##

(中序#B#D#A#C#,后序###DB##CA)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mu ziyang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值