数据结构与算法-二叉树

----------------------------学习数据结构第三天-------------------------------
前言:今天学习一下二叉树,以前没学的时候就感觉这个数据结构是个神奇的结构,一生二,二生四。。。对这个数据结构总是抱有莫大的好奇,今天终于学到了,感觉这个数据结构是非常奇妙的。
今天学习的内容是:1.二叉树的定义与创建 2.前序遍历 3.中序遍历 4.后序遍历 4.节点多少 5.树的深度 6.销毁二叉树
总结
1.二叉树的创建要用二级指针,我对这个为啥要用二级指针的原因也是一知半解,先暂时记住,以后用多了,就会慢慢理解吧。
2.前中后序遍历,这个前中后指的是双亲的位置,并且左右儿子的顺序总是左儿子在前,右儿子在后。例如前序遍历的顺序就是:双亲 左儿子 右儿子,其它两个也是如此。
3.销毁时,要判断节点的地址是否为空,然后free的也是节点的地址。
4.改变二叉树构造的话就要用二级指针,如果仅仅是查找值之类的一级指针即可。

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

typedef int TElemType;

typedef struct BiTNode
{
    TElemType data;
    struct BiTNode *LChild,*RChild;
}BiTNode,*BiTree;


int max(int a,int b)
{
    return a>b?a:b;
}
//创建二叉树是按前序遍历创建的
void CreateTree(BiTree *T)
{
    TElemType data;
    scanf("%d",&data);
    if(data==0)//当数据等于0时,表示不创建这个节点
    {
        *T=NULL;
        return ;
    }

    *T= (BiTNode *)malloc(sizeof(BiTNode));
    if(!T)printf("创建失败!\n");

    (*T)->data = data;//给节点赋值

    //递归创建左右子树分支
    CreateTree(&((*T)->LChild));
    CreateTree(&((*T)->RChild));
}

//前序遍历
void PrePrint(BiTree T)
{
    if(T==NULL)
        return ;
    printf("%d ",T->data);//输出自身

    //递归输出子树
    PrePrint(T->LChild);
    PrePrint(T->RChild);
}

//中序遍历
void MidPrint(BiTree T)
{
    if(T==NULL)
        return ;

    MidPrint(T->LChild);
    printf("%d ",T->data);
    MidPrint(T->RChild);
}

//后序遍历
void BackPrint(BiTree T)
{
    if(T==NULL)
        return ;

    BackPrint(T->LChild);
    BackPrint(T->RChild);
    printf("%d ",T->data);
}

//返回二叉树的深度
int BiTree_depth(BiTree T)
{
    int hl=0,hr=0;
    if(T==NULL)
      return 0;

    else
    {
        hl=BiTree_depth(T->LChild);
        hr=BiTree_depth(T->RChild);
        return max(hl,hr)+1;
    }
}

//返回二叉树的节点数
int Node_count(BiTree T)
{
    if(T==NULL)
        return 0;
    else
        return Node_count(T->LChild)+Node_count(T->RChild)+1;
}

//T是节点的地址的地址,*T才是节点的地址
void destroy(BiTree *T)
{
    if(*T!=NULL)//这里是*T,*T才是分配的空间的地址
    {
        destroy(&((*T)->LChild));
        destroy(&((*T)->RChild));
        free(*T);
    }
}

int main()
{
    BiTree *T;
    T=(BiTree *)malloc(sizeof(BiTree));
    CreateTree(T);

    printf("前序遍历:");
    PrePrint(*T);
    printf("\n中序遍历:");
    MidPrint(*T);
    printf("\n后序遍历:");
    BackPrint(*T);
    printf("\n节点数:%d",Node_count(*T));

    printf("\n深度:%d",BiTree_depth(*T));

    destroy(T);
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值