前言:本题是建立在有前置代码的基础上进行的
下面为前置代码
#include<bits/stdc++.h>
using namespace std;
typedef char ElementType;
typedef struct Node
{
ElementType data;
struct Node *lchild;
struct Node *rchild;
}BTNode,*BTree;
void destroyTree(BTree bt);
int main()
{
/*此处代码由测试程序自动添加,主要为了向顺序表中插入数据
并输出数据,你无需关心此处代码的具体实现细节。
如果有必要,请自己添加代码以测试你的函数是否正确。
*/
return 0;
}
/*你的提交的代码将被添加在此处,请完成题目所要求的函数的定义*/
第一题:二叉树创建
BTree createTree(char str[]){
int k = 0;//把k当做标志位,k=1的时候处理左子树,2处理右子树
int i,top;
BTNode *s[300],*p;//例如:‘(’、‘)’、‘,’
top = 0;//根
for (int i = 0;str[i] != '\0';i++) {
if(isalpha(str[i])){//测试字符是否为英文字母
p = (BTNode*) malloc (sizeof (BTNode));//开辟空间
p->data = str[i];//
p->lchild = NULL;
p->rchild = NULL;
if(k == 0){
s[1] = p;//此时是根
}
if(k == 1){
s[top] -> lchild = p;//给左子树
}
if(k == 2){
s[top]->rchild = p;//此时是右子树
}
}
else if(str[i] == '('){//(代表接下来是左子树
top++;//度加一(也就是高度)
s[top] = p;
k = 1;//现在是左子树
}
else if(str[i] == ','){
k = 2;//左子树结束,现在变为右子树
}
else if(str[i] == ')'){
top--;//右子树也结束,回到上一层
}
}
return s[1];
}
第二题:二叉树销毁
void destroyTree(BTree bt)
{
if(bt != NULL){
destroyTree(bt->lchild);
destroyTree(bt->rchild);
free(bt);
}
}
第三题:前序遍历
void preOrder(BTree bt){
if(bt != NULL){
printf("%c",bt->data);//打印出这个节点存储的数据
preOrder(bt->lchild);
preOrder(bt->rchild);
}
}
第四题:中序遍历
void inOrder(BTree bt){
if(bt != NULL){//左子节点不输出绝对不输出它的父节点
inOrder(bt -> lchild);
printf("%c ",bt->data);
inOrder(bt->rchild);
}
}
第五题:后序遍历
void postOrder(BTree bt){
if(bt != NULL){
postOrder(bt->lchild);
postOrder(bt->rchild);
printf("%c",bt -> data);
}
}
第六题:层序遍历
void layerOrder(BTree bt){
int i,j;
i = j = 0;
BTree p[300];
BTree n;
p[i++] = bt;//根节点
while(i != j){//开始对下一层进行遍历
n = p[j++];
printf("%c",n -> data);
if(n->lchild != NULL){
p[i++] = n->lchild;
}
if(n->rchild != NULL){
p[i++] = n->rchild;
}
}
}
第⑦题:树的广义表输出
void printTree(BTree bt)
{
if(bt!=NULL){
printf("%c",bt->data);
if(bt->lchild!=NULL||bt->rchild!=NULL){
printf("(");
printTree(bt->lchild);
printf(",");
printTree(bt->rchild);
printf(")");
}
}
}