c语言编程完成通过二叉树的顺序存储输入,创建二叉链树,利用上面创建的二叉链树,采用递归形式实现前序遍历和非递归形式完成中序遍历,并输出信息
时间: 2023-06-12 10:04:44 浏览: 167
以下是C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
// 定义二叉树结构体
typedef struct node{
char data;
struct node *lchild, *rchild;
} BiTNode;
// 定义栈结构体
typedef struct stack{
BiTNode *data[MAXSIZE];
int top;
} Stack;
// 初始化栈
void initStack(Stack *s){
s->top = -1;
}
// 判断栈是否为空
int isEmptyStack(Stack *s){
if(s->top == -1){
return 1;
}
return 0;
}
// 判断栈是否已满
int isFullStack(Stack *s){
if(s->top == MAXSIZE - 1){
return 1;
}
return 0;
}
// 入栈
int push(Stack *s, BiTNode *node){
if(isFullStack(s)){
return 0;
}
s->top ++;
s->data[s->top] = node;
return 1;
}
// 出栈
int pop(Stack *s, BiTNode **node){
if(isEmptyStack(s)){
return 0;
}
*node = s->data[s->top];
s->top --;
return 1;
}
// 创建二叉链表
void createBiTree(BiTNode **root){
char ch;
scanf("%c", &ch);
if(ch == '#'){
*root = NULL;
}else{
*root = (BiTNode*)malloc(sizeof(BiTNode));
(*root)->data = ch;
createBiTree(&((*root)->lchild));
createBiTree(&((*root)->rchild));
}
}
// 递归实现前序遍历
void preOrder(BiTNode *root){
if(root){
printf("%c ", root->data);
preOrder(root->lchild);
preOrder(root->rchild);
}
}
// 非递归实现中序遍历
void inOrder(BiTNode *root){
Stack s;
initStack(&s);
BiTNode *p = root;
while(p || !isEmptyStack(&s)){
// 将左子树依次入栈
while(p){
push(&s, p);
p = p->lchild;
}
// 左子树全部入栈后,开始出栈,出栈元素即为中序遍历顺序
if(!isEmptyStack(&s)){
pop(&s, &p);
printf("%c ", p->data);
// 将右子树入栈
p = p->rchild;
}
}
}
int main(){
BiTNode *root = NULL;
printf("请输入二叉树的顺序存储序列,其中用#表示空节点:\n");
createBiTree(&root);
printf("递归实现前序遍历结果为:");
preOrder(root);
printf("\n非递归实现中序遍历结果为:");
inOrder(root);
return 0;
}
```
运行结果为:
```
请输入二叉树的顺序存储序列,其中用#表示空节点:
AB##C##
递归实现前序遍历结果为:A B C
非递归实现中序遍历结果为:B A C
```
阅读全文