c语言二叉树基本操作

编译器为vs2013

#include "stdafx.h"

#include<malloc.h>

#include<stdlib.h>

 

#define OVERFLOW -1

 

typedef char BElemType;

typedef int Status;

 

typedef struct BiTree{

    BElemType data;

    struct BiTree *lchild,*rchild;

}BitNode,*BinTree;

 

//函数声明

void CreatTree(BinTree &T);                      //构建二叉树并赋值

void PreOrderTaverse(BinTree T);                 //先序遍历二叉树并输出

void InOrderTaverse(BinTree T);                  //中序遍历二叉树并输出

void PostOrderTaverse(BinTree T);                //后序遍历二叉树并输出

Status DepthTree(BinTree T);                     //返回树的深度

Status LeafNode(BinTree T, int &leaves);         //返回叶子结点个数

Status TreeNode(BinTree T, int &node);           //返回节点总数

 

int main()

{

    int h, leaves=0, node=0;

    BinTree T;

    CreatTree(T);

 

    PreOrderTaverse(T);

    printf("\n");

 

    InOrderTaverse(T);

    printf("\n");

 

    PostOrderTaverse(T);

    printf("\n");

 

    h=DepthTree(T);

    leaves=LeafNode(T,leaves);

    node = TreeNode(T,node);

    printf("树的高度为%d\n叶子节点数为%d\n节点总数为%d\n", h, leaves, node);

}

 

//构建二叉树并赋值

void CreatTree(BinTree &T)

{

    BElemType ch;

    scanf_s("%c", &ch);

    if (ch== ' ')

       T = NULL;

    else

    {

       if (!(T = (BinTree)malloc(sizeof(BitNode))))

           exit(OVERFLOW);

       T->data = ch;

       CreatTree(T->lchild);

       CreatTree(T->rchild);

    }

}

 

//先序遍历二叉树并输出

void PreOrderTaverse(BinTree T)

{

    if (T)

    {

        printf("%c ", T->data);

       PreOrderTaverse(T->lchild);

       PreOrderTaverse(T->rchild);

    }

}

 

//中序遍历二叉树并输出

void InOrderTaverse(BinTree T)

{

    if (T)

    {

       InOrderTaverse(T->lchild);

       printf("%c ", T->data);

       InOrderTaverse(T->rchild);

    }

}

 

//后序遍历二叉树并输出

void PostOrderTaverse(BinTree T)

{

    if (T)

    {

       PostOrderTaverse(T->lchild);

       PostOrderTaverse(T->rchild);

       printf("%c ", T->data);

    }

}

 

//返回树的深度

Status DepthTree(BinTree T)

{

    int dl,dr,deep;

    if (!T)

       deep = 0;

    else if ((T->lchild == NULL)&&(T->rchild == NULL))

       deep = 1;

    else

    {

       dl=DepthTree(T->lchild);

       dr=DepthTree(T->rchild);

       deep = 1 + (dl > dr ? dl : dr);

    }

    return deep;

}

 

//返回叶子结点个数

Status LeafNode(BinTree T,int &leaves)

{

    if (T)

    {

       if ((T->lchild == NULL) && (T->rchild == NULL))

           leaves++;

       LeafNode(T->lchild, leaves);

       LeafNode(T->rchild, leaves);

    }

    return leaves;

}

 

//返回节点总数

Status TreeNode(BinTree T,int &node)

{

    if (T)

    {

       node++;

       TreeNode(T->lchild, node);

       TreeNode(T->rchild, node);

    }

    return node;

}

转载于:https://www.cnblogs.com/cdp1591652208/p/6202722.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值