C语言实现二叉树(链式存储结构)+ 遍历

17 篇文章 0 订阅
17 篇文章 0 订阅

结构体定义及三种遍历方法

1. 结构体定义

#define MaxSize 100
//二叉树节点结构体定义
typedef char DataType;
typedef struct BiNode {
    DataType data;
    struct BiNode* lChild;
    struct BiNode* rChild;
}BiNode;

2. 先序遍历

先序遍历的递归实现

//先序遍历(递归)
void PreOrder(BiNode* root) {
    if(root == NULL) 
        return;
    else {
        printf("%c ", root->data);
        PreOrder(root->lChild);
        PreOrder(root->rChild);
    }
}

先序遍历的非递归实现

//先序遍历非递归
void PreOrder02(BiNode* root) {
    BiNode* S[MaxSize], *bt = root;
    int top = -1;
    while (bt != NULL || top != -1) {
        while(bt != NULL) {
            printf("%c ", bt->data);
            S[++top] = bt;
            bt = bt->lChild;
        }
        if(top != -1) {
            bt = S[top--];
            bt = bt->rChild;
        }
    }
}

3. 中序遍历

中序遍历的递归实现

//中序遍历(递归)
void InOrder(BiNode* root) {
    if(root == NULL) 
        return;
    else {
        InOrder(root->lChild);
        printf("%c ", root->data);
        InOrder(root->rChild);
    }
}

中序遍历的非递归实现

//中序遍历非递归
void InOrder02(BiNode* root) {
    BiNode* S[MaxSize], *bt = root;
    int top = -1;
    while (bt != NULL || top != -1) {
        while(bt != NULL) {
            S[++top] = bt;
            bt = bt->lChild;
        }
        if(top != -1) {
            bt = S[top--];
            printf("%c ", bt->data);
            bt = bt->rChild;
        }
    }
}

4. 后续遍历

后序遍历的递归实现

//后续遍历递归实现
void PostOrder(BiNode* root) {
    if(root == NULL) 
        return;
    else {
        PostOrder(root->lChild);
        PostOrder(root->rChild);
        printf("%c ", root->data);
    }
}

5. 二叉树的递归建立

//建立一颗二叉树
BiNode* CreateBiTree(BiNode* root) {
    char ch;
    cin>>ch;
    if(ch == '# ')
        root = NULL;
    else {
        root = (BiNode*)malloc(sizeof(BiNode));
        root->data = ch;
        root->lChild = CreateBiTree(root->lChild);
        root->rChild = CreateBiTree(root->rChild);
    }
    return root;
}

6. 二叉树的递归销毁

//销毁一颗二叉树
void DestroyBiTree(BiNode* root) {
    if(root == NULL) {
        return;
    } else {
        DestroyBiTree(root->lChild);
        DestroyBiTree(root->rChild);
        free(root);
    }
}

7. 主函数

//主函数
int main() {
    BiNode* root = NULL;
    root = CreateBiTree(root);
    printf("该二叉树的根节点是:%c\n", root->data);
    printf("前序遍历结果为:\n");
    PreOrder(root);
    printf("中序遍历结果为:\n");
    InOrder(root);
    printf("后续遍历结果为:\n");
    PostOrder(root);
    DestroyBiTree(root);
    system("pause");
    return 0;
}

注:本文代码源自清华大学出版社王红梅老师主笔的数据结构C语言实现,代码适用于已经有二叉树然后遍历它

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值