C二叉树操作图解(建树,遍历,销毁)

后面有图解

#include <stdio.h>
#include <stdlib.h>
#define maxn 100
typedef char DataType;          //定义数据类型

typedef struct BiNode
{
    DataType data;
    struct BiNode *Lchild,*Rchild;
} BiTree;

//前序遍历------顺序:根->左->右
void QPreOrder(BiNode *root)
{
    if(root == NULL) return;
    else
    {
        printf("%c ",root->data);   //根
        QPreOrder(root->Lchild);    //左
        QPreOrder(root->Rchild);    //右

    }
}

//后序遍历------:顺序:左->右->根
void HPreOrder(BiNode *root)
{
    if(root == NULL) return;
    else
    {
        HPreOrder(root->Lchild);    //左
        HPreOrder(root->Rchild);    //右
        printf("%c ",root->data);   //根

    }
}
//中序遍历------顺序:左->根->右
void ZPreOrder(BiNode *root)
{
    if(root == NULL) return;
    else
    {
        ZPreOrder(root->Lchild);    //左
        printf("%c ",root->data);   //根
        ZPreOrder(root->Rchild);    //右

    }
}

//建树
BiNode *CreatBiTree(BiNode *root)
{
    char chr;
    scanf("%c",&chr);
    if(chr == '#') root = NULL;//遇到#说明孩子为NULL,返回上一结点
    else{
        root = (BiNode *)malloc(sizeof(BiNode));
        root->data = chr;
        root->Lchild = CreatBiTree(root->Lchild);   //从左至右建树
        root->Rchild = CreatBiTree(root->Rchild);
    }
    return root;
}

//销毁树
void DesTree(BiNode *root)
{
    if(root == NULL) return ;
    DesTree(root->Lchild);
    DesTree(root->Rchild);
    free(root);         //从最右依次free至根节点
    }
int main()
{
    BiNode *root = NULL;
    root = CreatBiTree(root);
    printf("前序遍历结果:\n");
    QPreOrder(root);
    printf("\n");
    printf("中序遍历结果:\n");
    ZPreOrder(root);
    printf("\n");
    printf("后序遍历结果:\n");
    HPreOrder(root);
    printf("\n");
    return 0;
}

比如说,我要构造下图的二叉树



那么我们的输入应该是:

ABDG##H###CE#I##F##

解析:

从A->G:未遇见特殊字符'#',依次建立左子树.

G->H:G后读入特殊字符'#',则G左孩子为空;

继续读入下一个字符;

依然是'#',则G右孩子为空.

此时G左右孩子已输入,返回上一层D.

读入字符'H'写入D右孩子.

其他的以此类推即可



关于遍历:

依照上图前序遍历结果:

A B D G H C E I F


中序遍历结果:
G D H B A E I C F


后序遍历结果:
G H D B I E F C A


作者水平有限,如有错误,敬请指正


转载于:https://www.cnblogs.com/bestsort/p/10588915.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值