分层打印出二叉树的节点,在本文中的解题思路是,把二叉树的节点放到一个对应的数组中,然后打印出数组。在这里重要的是怎样把二叉树的节点数值放到对应的数组中。
图 1满二叉树
上图是满二叉树的图形,可以看到不同的借点所对应的位置。我们要做的就是把节点放到数组中。比如,把“i”节点中的数值放到对应的数组“i“的位置。如果二叉树不是一个满二叉树,我们可以在上面补零,找出在满二叉树是他们所对应的位置。下面就是代码。
typedef struct BiTNode{
int data;
struct BiTNode *lchild,*rchild;
}*BiTree;
struct SqList
{
int elem[200];//将二叉树的节点数值存放到这个数组中,暂时定义数组长度为200
int length;
};
BiTNode *CreatTree(BiTNode *T) //利用递归方法创建二叉树
{
int ch;
scanf("%d",&ch);
if (ch==0)
{
return NULL;
}
else
{
T=(BiTNode*)malloc(sizeof(BiTNode));
if (T==NULL)
{
printf("内存不足");
}
T->data=ch;
T->lchild=CreatTree(T->lchild);
T->rchild=CreatTree(T->rchild);
}
return T;
}
下面是将二叉树的节点存放到数组中的函数,同样利用递归方法。
void Store(BiTNode *T,SqList *L,int k)
{
if (T==NULL)
{
L->elem[k]=' ';
}
else
{
L->elem[k]=T->data;
Store(T->lchild,L,2*k);
Store(T->rchild,L,2*k+1);
}
}
下面是测试函数
int main()
{
BiTNode *T=NULL;
T=(BiTree)malloc(sizeof(BiTNode));
T=CreatTree(T);
SqList *L=(SqList*)malloc(sizeof(SqList));
memset(L->elem,0,200*sizeof(int)); //初始化数组为0
Store(T,L,1);
for(int i=0;i<200;i++)
{
printf("%d ",L->elem[i]);
}
如果创建如下图的二叉树
图2
则输出结果是
图 3
大家可以把上面的二叉树补充为满二叉树,对照他们在数组中的位置观察