0
点赞
收藏
分享

微信扫一扫

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

凌得涂 2022-03-21 阅读 68
算法

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

下面为前置代码

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

相关推荐

二叉树的先序 中序 后序遍历

0 条评论