输入样例
6
abc
bdi
cj#
d##
i##
j##
前序输出:
abdicj
中序输出
dbiajc
代码思想
采用二维字符数组存储输入信息,后不使用创建二叉树的方法(采用创建二叉树的方法可以是顺序存储结构以及链式,实现起来比较简单,但没有必要),直接采用栈的思想进行前中序遍历,比如前序:第一个进栈前先打印,后判断栈顶指针是否由儿子结构就是值不为’#’,如果有打印进栈,并修改值’#’(改值的目的是防止下次判断时形成死循环),如果没有判断有孩子是否有打印进栈修改值为’#’,后出栈,依次进行,中序思想也差不多,第一个孩子为空时打印,并直接出栈,再判断右孩子,也需要修改值,具体代码如下所示
```c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define Max 10
char chArr[Max][3];
int number;
typedef struct stack {
int data[Max];
int top;
} *Stack, mystack;
void init(Stack S) {
for (int i = 0; i < Max; ++i)
{
S->data[i]=0;
}
S->top=-1;
}
int empty(Stack S) {
if(S->top == -1) {
return 1;
}
return 0;
}
void push(Stack S,int data) {
S->data[++S->top]=data;
}
void pop(Stack S,int *data) {
*data=S->data[S->top--];
}
void gettop(Stack S,int *data) {
*data=S->data[S->top];
}
int getposition(int m,int n) {
for (int i = 0; i < number; ++i)
{
if(chArr[i][0] == chArr[m][n]) {
return i;
}
}
return 0;
}
int main() {
Stack S;
S=(Stack)malloc(sizeof(mystack));
init(S);
int data,i,k,p;
printf("please input number\n");
scanf("%d",&number);
i=0;
while(i<number) {
scanf("%s",chArr[i]);
++i;
};
/////先序遍历
/*
printf("%c ",chArr[0][0]);
push(S,0);
while(1) {
if(empty(S)) {
break;
}
gettop(S,&k);
if(chArr[k][1]!='#') {
p=getposition(k,1);
printf("%c ",chArr[p][0]);
chArr[k][1]='#';
push(S,p);
} else {
if(chArr[k][2]!='#') {
p=getposition(k,2);
printf("%c ",chArr[p][0]);
chArr[k][2]='#';
push(S,p);
}
else {
pop(S,&data);
}
}
}
*/
////////中序遍历
push(S,0);
while(1) {
if(empty(S)) {
break;
}
gettop(S,&k);
if(chArr[k][1]!='#') {
p=getposition(k,1);
chArr[k][1]='#';
push(S,p);
} else {
printf("%c\n",chArr[k][0]);
pop(S,&data);
if(chArr[k][2]!='#') {
p=getposition(k,2);
chArr[k][2]='#';
push(S,p);
}
}
}
return 0;
}```