题目描述
输入一串二叉树,输出其前序遍历。
输入格式
第一行为二叉树的节点数 nn。(1 \leq n \leq 261≤n≤26)
后面 nn 行,每一个字母为节点,后两个字母分别为其左右儿子。特别地,数据保证第一行读入的节点必为根节点。
空节点用
*
表示输出格式
二叉树的前序遍历。
输入输出样例
输入 #1复制
6 abc bdi cj* d** i** j**输出 #1复制
ab
1.该题是需要搜素加创建二叉树。
2.我们可以递归搜素找节点,一步一步的遍历左右子树,然后根据该节点去创建节点。而二叉树可以看成链表。直接静态创建左右子树即可。
3.每次输入我们都需要去查找,但是根节点是需要单独创建的,因为不是根节点我们只需要创建左右子树即可,遇到*号的情况连接上NULL即可。
4.我们在创建的时候,要注意返回头节点,否则会出错。
代码如下:
#include<stdio.h>
#include<malloc.h>
typedef struct node
{
char ch;
struct node *lnext;
struct node *rnext;
}NODE;
NODE *creat(NODE *head,char t,char l,char r)
{
NODE *p,*q;
if(head==NULL)
{
// if(t=='*') return NULL;
head=(NODE*)malloc(sizeof(NODE));
head->ch=t;
p=NULL;
q=NULL;
if(l!='*')
{
p=(NODE*)malloc(sizeof(NODE));
p->ch=l;
p->lnext=NULL;
p->rnext=NULL;
}
if(r!='*')
{
q=(NODE*)malloc(sizeof(NODE));
q->ch=r;
q->lnext=NULL;
q->rnext=NULL;
}
head->lnext=p;
head->rnext=q;
}
if(head->ch==t)
{
p=NULL;
q=NULL;
if(l!='*')
{
p=(NODE*)malloc(sizeof(NODE));
p->ch=l;
p->lnext=NULL;
p->rnext=NULL;
}
if(r!='*')
{
q=(NODE*)malloc(sizeof(NODE));
q->ch=r;
q->lnext=NULL;
q->rnext=NULL;
}
head->lnext=p;
head->rnext=q;
}
else
{
creat(head->lnext,t,l,r);
creat(head->rnext,t,l,r);
}
return head;
}
int put(NODE *head)
{
if(head==NULL) return 0;
printf("%c",head->ch);
put(head->lnext);
put(head->rnext);
}
int main()
{
int m;
NODE *head=NULL;
char s[4],t,l,r;
scanf("%d",&m);
while(m--)
{
scanf("%s",s);
t=s[0];l=s[1];r=s[2];
head=creat(head,t,l,r);
}
put(head);
return 0;
}