一、题目
编一个程序,读入先序遍历字符串,根据此字符串建立一棵二叉树(以指针方式存储)。
二、分析
首先根据先序遍历,用链表的存储方式,创建一棵二叉链表数。
然后控制格式进行输出即可。其实题目中的输出格式,便是二叉树根据“右”、“根”、“左”这样的次序,然后空格数就是深度乘以4。
细观察输出的格式,,右、根、左。
然后找到相应的解决措施。
二叉树的大部分算法都基于遍历的积除上。
三、算法实现
(主要代码)
typedef struct tree
{
char data[5];
struct tree*ld,*rd;
}*Tree;
char s[100][5];
int n,k;
void xiu(char *str)//修改一下,便于先序创建二叉树
{
int i,j,flag;
for(i=0; str[i];)
{
flag=j=0;
while(str[i]!=' '&&str[i]!='\0')
{
flag=1;
s[n][j++]=str[i];
i++;
}
if(flag==1)
{
s[n][j]='\0';
n++;
}
else
i++;
}
}
void creat(Tree &T)//先序递归创建二叉树
{
if(k<n)//递归出口
{
if(s[k][0]=='#')
{
T=NULL;
k++;
}
else
{
T=(Tree)malloc(sizeof(struct tree));
strcpy(T->data,s[k++]);
creat(T->ld);
creat(T->rd);
}
}
}
void display(Tree T,int depth)//格式输出,右、根、左。
{
if(T)
{
display(T->rd,depth+1);
int cnt=depth*4;
for(int i=0; i<cnt; i++)
printf(" ");
printf("%s\n",T->data);
display(T->ld,depth+1);
}
}
int main()
{
Tree T=NULL;
char str[110];
while(gets(str))
{
if(s[0]=='\0')
break;
n=k=0;
xiu(str);
creat(T);
display(T,0);
printf("\n");
T=NULL;
}
return 0;
}
四、算法分析
算法分析:先是修改函数O(N),然后递归创建O(logN),然后递归输出,O(logN),故其时间复杂度为O(N)。
空间复杂度为:调用了栈空间O(logN),然后数组O(N),故为O(N)。