1)用二叉链表作为存储结构;
2)分别按先序,中序和后序遍历二叉树;
3)编写交换二叉树中所有结点左右孩子的非递归算法。
二、实验方案
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define STACK_MAX_SIZE 30
#define QUEUE_MAX_SIZE 30
#ifndef elemType
typedef char elemType;
#endif
struct BTreeNode{
elemType data;
struct BTreeNode *lchild;
struct BTreeNode *rchild;
};
/* 1.初始化二叉树 */
void initBTree(struct BTreeNode* *bt)
{
*bt = NULL;
return;
}
/* 2.建立二叉树(根据a所指向的二叉树广义表字符串建立) */
void createBTree(struct BTreeNode* *bt, char *a)
{
struct BTreeNode *p;
struct BTreeNode *s[STACK_MAX_SIZE];/* 定义s数组为存储根结点指针的栈使用 */
int top = -1; /* 定义top作为s栈的栈顶指针,初值为-1,表示空栈 */
int k; /* 用k作为处理结点的左子树和右子树,k = 1处理左子树,k = 2处理右子树 */
int i = 0; /* 用i扫描数组a中存储的二叉树广义表字符串,初值为0 */
*bt = NULL; /* 把树根指针置为空,即从空树开始建立二叉树 */
/* 每循环一次处理一个字符,直到扫描到字符串结束符/0为止 */
while(a
!= '/0'){
switch(a
)
{
case ' ': break; /* 对空格不作任何处理 */
case '(':
if(top == STACK_MAX_SIZE - 1){
printf("zhankongjiantaixiao!/n");
exit(1);
}
top++;
s[top] = p;
k = 1;
break;
case ')':
if(top == -1){
printf("erchashuguangyibiaozifucuancuowu!/n");
exit(1);
}
top--;
break;
case ',':
k = 2;
break;
default:
p=malloc(sizeof(struct BTreeNode));
p->data = a
;
p->lchild = p->rchild = NULL;
if(*bt==NULL){
*bt = p;
}else
{
if( k == 1){
s[top]->lchild = p;
}else
{
s[top]->rchild = p;
}
}
}
i++; /* 为扫描下一个字符修改i值 */
}
return;
}
/* 前序遍历 */
void preOrder(struct BTreeNode *bt)
{
if(bt != NULL){
printf("%c ", bt->data); /* 访问根结点 */
preOrder(bt->lchild); /* 前序遍历左子树 */
preOrder(bt->rchild); /* 前序遍历右子树 */
}
return;
}
/* 中序遍历 */
void inOrder(struct BTreeNode *bt)
{
if(bt != NULL){
inOrder(bt->lchild); /* 中序遍历左子树 */
printf("%c ", bt->data); /* 访问根结点 */
inOrder(bt->rchild); /* 中序遍历右子树 */
}
return;
}
/* 后序遍历 */
void postOrder(struct BTreeNode *bt)
{
if(bt != NULL){
postOrder(bt->lchild); /* 后序遍历左子树 */
postOrder(bt->rchild); /* 后序遍历右子树 */
printf("%c ", bt->data); /* 访问根结点 */
}
return;
}
/* 按层遍历 */
void levelOrder(struct BTreeNode *bt)
{
struct BTreeNode *p;
struct BTreeNode *q[QUEUE_MAX_SIZE];
int front = 0, rear = 0;/* 将树根指针进队 */
if(bt != NULL)
{
rear = (rear + 1) % QUEUE_MAX_SIZE;
q[rear] = bt;
}
while(front != rear){ /* 队列非空 */
front = (front + 1) % QUEUE_MAX_SIZE; /* 使队首指针指向队首元素 */
p = q[front];
printf("%c ", p->data); /* 若结点存在左孩子,则左孩子结点指针进队 */
if(p->lchild != NULL)
{
rear = (rear + 1) % QUEUE_MAX_SIZE;
q[rear] = p->lchild;
} /* 若结点存在右孩子,则右孩子结点指针进队 */
if(p->rchild != NULL){
rear = (rear + 1) % QUEUE_MAX_SIZE;
q[rear] = p->rchild;
}
}
return;
}
void change(struct BTreeNode *bt)
{
struct BTreeNode *p;
struct BTreeNode *k;
struct BTreeNode *q[QUEUE_MAX_SIZE];
int front = 0, rear = 0;/* 将树根指针进队 */
if(bt!= NULL)
{
rear = (rear + 1) % QUEUE_MAX_SIZE;
q[rear] = bt;
}
while(front != rear)
{ /* 队列非空 */
front = (front + 1) % QUEUE_MAX_SIZE; /* 使队首指针指向队首元素 */
p = q[front];
printf("%c ", p->data);
if(p->lchild != NULL&&p->rchild != NULL) /* 若结点存在左孩子,则左孩子结点指针进队 */
{k=p->lchild;
p->lchild=p->rchild;
p->rchild=k;
rear = (rear + 1) % QUEUE_MAX_SIZE;
q[rear]=p->lchild;
rear = (rear + 1) % QUEUE_MAX_SIZE;
q[rear]=p->rchild;
}
else
if(p->lchild= NULL&&p->rchild!= NULL)
{
rear = (rear + 1) % QUEUE_MAX_SIZE;
q[rear] = p->rchild;
}
else
if(p->rchild= NULL &&p->lchild!= NULL)
{
rear = (rear + 1) % QUEUE_MAX_SIZE;