数据结构都学了好些年了,怎么建棵树是最近才搞懂的。
首先是数据结构:
typedef struct tnode
{
int data;
struct tnode *lchild, *rchild;
}treenode;
typedef struct snode
{
int num;
treenode *aa[100];
}stack;
算法步骤:
步骤1:
建立一个一维数组a,将读入的数存入其中。输入的数须保证是按先序输入的,并且所有节点都有两个子节点。若没有子节点,则以-1代替。最后以-2结束输入。
步骤2:
检查数组中的第一个数,若是-2,表示是空树,并返回0;
步骤3:
依次将a中的数压入栈中,直至碰到-1。并将-1前一个数的左子树设为NULL。
步骤4:
接着读入-1后的数,若为-1,则弹出栈的数字,将其右子树设为0;直至不是-1。
步骤5:
若此时栈非空,则继续弹出栈中数字,将其右子树赋值为读入的数。
步骤6:
回到步骤3,直至栈非空。
以下为代码:
treenode *creattree()
{
int a[100];
int i = 0;
scanf("%d", &a[0]);
while (a[i] != -2)
{
i++;
scanf("%d", &a[i]);
}
if (a[0] == -2)
return NULL;
treenode *p, *q, *r;
treenode *head = (treenode *)malloc(sizeof (treenode));
head->data = a[0];
head->lchild = NULL;
head->rchild = NULL;
i = 1;
push(head);
q = head;
while(st.num > 0)
{
while (a[i] != -1)
{
p = (treenode *)malloc(sizeof (treenode));
p->data = a[i];
p->lchild = NULL;
p->rchild = NULL;
i++;
push(p);
q->lchild = p;
q = p;
}
i++;
q->lchild = NULL;
while (a[i] == -1)
{
i++;
r = pop();
r->rchild = NULL;
}
if (st.num >0)
{
q = pop();
p = (treenode *)malloc(sizeof (treenode));
p->data = a[i];
p->lchild = NULL;
p->rchild = NULL;
push(p);
q->rchild = p;
q = p;
i++;
}
}
return head;
}
若有不对的地方,麻烦大家指出~