二叉树
二叉树的性质
- 在非空二叉树上,第i层上至多有2i-1个结点(i>=1)
- 深度为k的二叉树至多有2k-1个结点(i>=1)
- 对任何一颗二叉树,若其叶子结点数为n0,度为2的结点数为n2,则n0=n2+1
- n个结点的完全二叉树深度为:log2n向下取整再加1
满二叉树
一棵深度为k且有2k-1个结点的二叉树称为满二叉树
完全二叉树
深度为k的满二叉树中编号从1到n的前n个结点构成了一棵深度为k的完全二叉树
二叉树的存储结构
顺序存储的类型定义
#define MAX_SIZE 100
typedef telemtype sqbitree[MAX_SIZE];
链式存储的类型定义
1.二叉链表结点
typedef struct BTNode
{
ElemType data;
struct BTNode *Lchild,*Rchild;
}BTNode;
2.三叉链表结点
typedef struct BTNode_3
{
ElemType data;
struct BTNode_3 *Lchild,*Rchild,*parent;
}BTNode_3;
二叉树的遍历及其应用
二叉树链表的创建
按满二叉树创建
对每个结点输入i(结点编号)和ch(结点内容)借助一个一维数组S[n],编号为i的结点保存在S[i]中
#define MAX_NODE 50;
typedef struct
{
char data;
struct BTNode *Lchild,Rchild;
}BTNode;
BTNode *Create_BTree(void)
{
BTNode *T,*p,*s[MAX_NODE];
char ch;
int i,j;
while (1)
{
scanf("%d",&i)
if(i==0)
break;//以编号为0作为结束
else
{
ch=getchar();
p=(BTNode*)malloc(sizeof(BTNode));
p->data=ch;
p->Lchild=p->Rchild=NULL;
S[i]=p;
if(i==1)
T=p;
else
{
j=i/2;//j是i的双亲结点的编号
if(i%2==0)
s[j]->Lchild=p;
else
s[j]->Rchild=p;
}
}
}
return(T);
}
先序遍历创建
#define NULLKY ‘?’
#define MAX_NODE 50
typedef struct
{
char data;
struct BTNode*Lchild,*Rchild;
}BTNode;
void Preorder_Create_BTree(BTNode **T)
{
BTNode *p;
char ch=getchar();
if(ch==NULLKY)
{
P=NULL;
}
else
{
p=(BTNode*)malloc(sizeof(BTNode));
p->data=ch;
Preorder_Create_BTree(p->Lchild);
Preorder_Create_BTree(p->Rchild);
}
*T=p;
}
求二叉树的叶子结点数
#define MAX_NODE 50;
int search_leave(BTNode *T)
{
BTNode *Stack[MAX_NODE],*p=T;
int top=0,num=0;
if(T!=NULL)
{
stack[++top]=p;
while(top>0)
{
p=stack[top--];
if(p->Lchild==NULL&&p->Rchild==NULL)
num++;
if(p->Rchild!=NULL)
stack[++top]=p->Rchild;
if(p->Lchild!=NULL)
stack[++top]=p->Lchild;
}
}
return (num);
}
遍历二叉树的深度
#define MAX_NODE 50
int search_depth(BTNode *T)
{
BTNode *Stack[MAX_NODE],*p=T;
int front=0;rear=0;depth=0,level;
//level总是指向访问层的最后一个结点在队列的位置
if(T!=NULL)
{
Queue[++rear]=p;
level=rear;//根是第一层的最后一个结点
while(front<rear)
{
p=Queue[++front];
if(p->Lchild!=NULL)
Queue[++rear]=p;
if(p->Rchild!=NULL)
Queue[++rear]=p;
if(front==level)
{
depth++;
level=rear;
}
}
}
}