关于实现二叉树各个结点的随机访问 ( 修改删除和插入) 问题
算法分析:
先定义一个全局指针类型的数组*a[100]. 为了实现二叉树各结点的随机访问, 我们可以在按照某种序列( 例如: 先序) 创建的同时, 将生成的结点依次存入定义的指针类型数组中. 即各个结点的地址也按照某种序列( 先序 ) 顺序存入指针类型数组中.
在这里以先序创建为例
如图所示:
1
/ \
2 7
/ \ / \
3 4 8 9
/ \
5 6
图中数字为以先序创建二叉树, 所创建各结点的顺序
对于各结点的地址也以此序列存入数组a中;
由于数组a可以实现随机访问;
此时只需要随机访问数组下标,即可实现各结点的随机访问
代码实现:
这里的访问为输出结点
#include<stdio.h>
#include<stdlib.h>
struct node {
intLtag;
structnode *Lchild;
intdata;
intRtag;
structnode *Rchild;
}*pre,*top[20];
int i=0,j=0;
inta[20]={1,2,3,0,0,4,5,0,0,6,0,0,7,8,0,0,9,0,0};
int main()
{
intk;
voidcreat(struct node **root);
structnode *root,*s,*h;
creat(&root);
printf("结点存放按先序创建并存放\n");
printf("输入要访问的第i个结点:");
scanf("%d",&i);
if(i-1>9||i-1<0)
printf("输入有误!\n");//共创建了9个结点
else{
s=top[i-1];
printf("%d\n",s->data);
}
return0;
}
void creat(struct node **root)//先序创建二叉树
{
if(a[i]==0){
*root=NULL;
i++;
}
else{
(*root)=(structnode *)malloc(sizeof(struct node ));
top[j]=(*root); //将新建结点存入数组top中
j++; //数组下标加1
(*root)->Ltag=(*root)->Rtag=0;
(*root)->data=a[i];//给结点赋值
i++;
creat(&(*root)->Lchild);
creat(&(*root)->Rchild);
}
}