<C语言-输入一串字符表示二叉树的信息后进行遍历>

输入样例

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;
}```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值