一.定义一棵树
//双亲表示法
#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)深度为k的二叉树至多有个结点
(3)对任何一颗二叉树T,其终端结点数为n0,度为2的结点数为n2,则n0=n2+1;设度为1的结点数为n1,则树的节点总数n=n0+n1+n2
(4)具有n个结点的完全二叉树的深度为,(其中[x]表示为不大于x的最大整数)
(5)如果对一棵有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)