二叉树的存储结构
一 二叉树的顺序存储结构
将二叉树从跟节点开始依次存入连续的存储单元,如果一个节点为空则在数组中存入空值,以明确位置。(由节点的物理位置明确节点之间的关系)
顺序存储结构优点是完全适合二叉树的存储,缺点是当遇到单斜树时就会浪费存储空间。
#define maxszie 1000
typedef datatype sqtree[maxsize]
构造二叉树的顺序存储结构的算法
void CreateBTree (sqtree bt) //按照二叉树依次顺序读入元素,(虚节点是@,结束符是#),建立顺序存储结构,bt[0]未用到
{
int i=1;
datatype ch;
ch=getchar(); //读入元素
while(ch!='#')
{
bt[i]=ch;
i++;
ch=getchar();
}
b[i]='#';
}
二 二叉树的链式存储结构
节点应包括三个域
| data | Lchild | Rchild |
data是这个节点的数据,Lchild,RChild存放指向左右子节点的指针。
有时候为了便于检索双亲节点会增加一个指向双亲的指针,Paraent域
(1)插入算法
//按照层次顺序依次输入节点
typedef char datatype
typedef struct Bnode
{
datatype data;
struct Bnode* LChild,*RChild;
}Btnode,*BTptr;
BTptr CreateBtree(BTptr BT)
{
BTptr p,q;
int i=0;
char ch;
ch=getchar();
while(ch!='#')
{
p=NULL;
if(ch!='@') //如果输入的数值为@的话,则新节点为NULL,否则再申请新地址
{
p=(BTptr)malloc(sizeof(Btnode));
p->data=ch;
p->LChild=NULL;
p->RChild=NULL;
}
i++;
Enqueue(Q,p);
if(i==1)
{
BT=p; //使根节点指向第一个输入的元素
}
q=GetTop()
if(q&&p)
{
if(i%2==0)
q->LChild=p; //i为偶数的时候为双亲的左节点
else //否则为右节点
{
q->RChild=p;
DelQueue(Q,q); //当前双亲处理完,从队列中删除
}
}
ch=getchar();
}
return BT;
}
浙公网安备 33010602011771号