数据结构(c语言版) 树的遍历

作业要求

以如下图为例,完成树的遍历:
1、利用孩子兄弟表示法的存储结构
2、利用先根序列创建树
3、先根遍历树
4、后根遍历树
数据结构(c语言版) 树的遍历_第1张图片

思考

预期的结果应该为:

1、先根创建树时需要输入的数据为:

A B E 0 F 0 0 C 0 D G 0 0 0 0

2、先根遍历的输出结果为:

A B E F C D G

3、后根遍历的输出结果为:

E F B C G D A

代码实现

#include 
#include 

// 创建结构体
struct TreeNode{
    char data;
    struct TreeNode *firstchild;
    struct TreeNode *nextsibling;
};

//先根创建孩子兄弟链表
void CreatTree(struct TreeNode **T) {
    char ch;
    scanf("\n %c", &ch);
    if (ch == '0') {
        *T = NULL;
    }
    else {
        *T = (struct TreeNode *) malloc(sizeof(struct TreeNode));
        (*T)->data = ch;
        CreatTree(&((*T)->firstchild));         // 创建第一个孩子结点
        CreatTree(&((*T)->nextsibling));        // 创建右兄弟结点
    }
}

//先根遍历
void RootFirst(struct TreeNode *T){
    struct TreeNode *p;
    if(T!=NULL){
        printf("%3c",T->data);      //打印根结点
        p = T->firstchild;                  //指向根的第一个孩子结点
        while (p){
            RootFirst(p);
            p = p->nextsibling;            //指向下一个孩子结点,即当前结点的右兄弟结点
        }
    }
}

// 后根遍历
void RootLast(struct TreeNode *T){
    if (T != NULL) {
        struct TreeNode* Fchild = T->firstchild; //获取第一棵子树
        while (Fchild != NULL) {                //依次访问每一棵子树
            RootLast(Fchild);                  //后序访问子树
            Fchild = Fchild->nextsibling;     //访问另一棵子树
        }
        printf("%3c", T->data);      //访问根节点
    }

}

int main(){
    struct TreeNode *t;
    printf("***************先根创建树***************\n");
    printf("请输入结点树的数据:");
    CreatTree(&t);

    printf("***************先根遍历树***************\n");
    printf("先根遍历结点结果:");
    RootFirst(t);

    printf("\n***************后根遍历树***************\n");
    printf("后根遍历结点结果:");
    RootLast(t);
}

运行结果

数据结构(c语言版) 树的遍历_第2张图片

你可能感兴趣的:(数据结构,c语言版,数据结构,c语言)