数据结构之树 (创建,先序,中序,后序遍历等等)

前言:本题是建立在有前置代码的基础上进行的

下面为前置代码

#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(")");
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Abandon-Lv

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值