通过键盘输入的扩充二叉树的层次遍历序列, 建立二叉树(如:序列:2,5,6,0,0,10,11,0,0,0,0 )。(设二叉树结点的数据为int型,其中扩充结点用'0'号表示)。然后按中序和后序输出此二叉树,求该树的叶结点个数和度数为2的结点个数)。
你题目的解答代码如下:
#include "stdio.h"
#include "malloc.h"
typedef struct treenode
{
int data;
struct treenode *lchild, *rchild;
} TREENODE, *TREENODEPTR;
#define N 50
void creattree(TREENODEPTR *root)
{
int value, r1, r2;
TREENODEPTR t, q[N];
scanf("%d", &value);
if (value)
{
*root = (TREENODEPTR)malloc(sizeof(TREENODEPTR));
(*root)->data = value;
r2 = r1 = 1;
q[r1] = *root;
}
else
{
printf("input error\n");
return;
}
while (r2 <= r1)
{
t = q[r2];
r2++;
scanf("%d", &value);
if (value == 0)
t->lchild = NULL;
else
{
t->lchild = (TREENODEPTR)malloc(sizeof(TREENODEPTR));
t->lchild->data = value;
r1++;
q[r1] = t->lchild;
}
scanf("%d", &value);
if (value == 0)
t->rchild = NULL;
else
{
t->rchild = (TREENODEPTR)malloc(sizeof(TREENODEPTR));
t->rchild->data = value;
r1++;
q[r1] = t->rchild;
}
}
}
/*非递归中序遍历二叉树*/
void InOrder(TREENODEPTR root)
{
TREENODEPTR q[N];
int top = 0;
TREENODEPTR p;
p = root;
do
{
while (p != NULL)
{
if (top > N)
return;
top = top + 1;
q[top] = p;
p = p->lchild;
};
if (top != 0)
{
p = q[top];
top = top - 1;
printf("%3d", p->data);
p = p->rchild;
}
} while (p != NULL || top != 0);
}
/*非递归后序遍历二叉树*/
void PostOrder(TREENODEPTR root)
{
TREENODEPTR p, r, q[N];
int top = 0;
r = NULL;
p = root;
while (p != NULL || top != 0)
{
while (p != NULL)
{
top++;
if (top >= N)
return;
q[top] = p;
p = p->lchild;
}
if (top > 0)
{
p = q[top];
if ((p->rchild == NULL) || (p->rchild == r))
{
printf("%3d", p->data);
r = p;
top--;
p = NULL;
}
else
p = p->rchild;
}
}
}
main()
{
TREENODEPTR root;
root = NULL;
printf("输入的扩充二叉树的层次遍历序列为:\n");
creattree(&root);
printf("非递归中序遍历二叉树:\n");
InOrder(root);
printf("\n");
printf("非递归后序遍历二叉树:\n");
PostOrder(root);
printf("\n");
}
如有帮助,望采纳!谢谢!