C语言实现链式二叉树&遍历二叉树

二叉树(binary tree)是一种常见的树形数据结构,其特点是每个结点至多有两棵子树,并且,二叉树的子树有左右树之分,其次序不能任意颠倒。
在对二叉树进行遍历之前,我们先构造一个二叉树。我们这里使用链式二叉树来构造我们的树。

typedef char TElemType;
typedef struct BiTNode{
    TElemType data;
    struct BiTNode *lchild;  // 左节点
    struct BiTNode *rchild;  // 右节点
}BiTNode, *BiTree;

接下来我们开始构造我们的二叉树:
这里我们采用先序构造的方式

char auxiliary(){
    // 自暴自弃系列
    const char data[] = "-+a  *b  -c  d  /e  f  ";  // 课本图6.9中的例子
    int length = strlen(data);
    // printf("length is %d", length);
    if (i < length){
        return data[i++];
    }else{
        return ' ';
    }
}

void createBiTree(BiTree *t){
    // 创建一个二叉树,以先序序列创建
    TElemType ch = auxiliary();
    // scanf(&ch);
    if (ch == ' ') *t = NULL;
    else{
        // 分配空间
        *t = malloc(sizeof(BiTNode));
        if (!*t) perror("can't allocate memory");
        (*t) -> data = ch;
        // left subtree
        createBiTree(&((*t)->lchild));
        // right subtree
        createBiTree(&((*t)->rchild));
    }
}

完整代码如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int i = 0;

typedef char TElemType;
typedef struct BiTNode{
    TElemType data;
    struct BiTNode *lchild;  // 左节点
    struct BiTNode *rchild;  // 右节点
}BiTNode, *BiTree;

char auxiliary(){
    // 自暴自弃系列
    const char data[] = "-+a  *b  -c  d  /e  f  ";  // 课本图6.9中的例子
    int length = strlen(data);
    // printf("length is %d", length);
    if (i < length){
        return data[i++];
    }else{
        return ' ';
    }
}

void createBiTree(BiTree *t){
    // 创建一个二叉树,以先序序列创建
    TElemType ch = auxiliary();
    // scanf(&ch);
    if (ch == ' ') *t = NULL;
    else{
        // 分配空间
        *t = malloc(sizeof(BiTNode));
        if (!*t) perror("can't allocate memory");
        (*t) -> data = ch;
        // left subtree
        createBiTree(&((*t)->lchild));
        // right subtree
        createBiTree(&((*t)->rchild));
    }
}

int preorderTraverse(BiTree b){
    // 先序遍历
    if (b){
        if (printf("%c", b->data)){
            if (preorderTraverse(b->lchild)){
                if (preorderTraverse(b->rchild)) return 1;
            }
        }
        return 0;
    }else{
        return 1;
    }
}

void inorderTraverser(BiTree b){
    // 中序遍历
    if (b){
        if (b->lchild) inorderTraverser(b->lchild);
        printf("%c", b->data);
        if (b->rchild){
            inorderTraverser(b->rchild);
        }
    }
}

void postOrderTraverse(BiTree b){
    if (b){
        if (b->lchild) postOrderTraverse(b->lchild);
        if (b->rchild) postOrderTraverse(b->rchild);
        printf("%c", b->data);
    }
}

void insertChild(BiTree t, BiTNode p, int LR, TElemType c){};

void main(){
    BiTree t;  // 初始化一个头结点
    // printf('initial data is %c', t->data);
    createBiTree(&t);
    preorderTraverse(t);
    printf("\n");
    inorderTraverser(t);
    printf("\n");
    postOrderTraverse(t);
}

运行结果如下:

-+a*b-cd/ef
a+b*c-d-e/f
abcd-*+ef/-
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 14,565评论 0 25
  • 1.树(Tree): 树是 n(n>=0) 个结点的有限集。当 n=0 时称为空树。在任意一颗非空树中:有且仅有一...
    ql2012jz阅读 4,714评论 0 3
  • 第一章 绪论 什么是数据结构? 数据结构的定义:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 第二章...
    SeanCheney阅读 11,073评论 0 19
  • 课程介绍 先修课:概率统计,程序设计实习,集合论与图论 后续课:算法分析与设计,编译原理,操作系统,数据库概论,人...
    ShellyWhen阅读 6,891评论 0 3
  • 0. 什么是树 数据的基本单位是数据元素,在涉及到数据处理时数据元素之间的关系称之为结构,我们依据数据元素之间关系...
    安安zoe阅读 3,369评论 0 0