二叉树的用法

定义二叉树

#include<stdio.h>
#include<stdlib.h>
#define QUEUE_MAXSIZE 50
typedef char DATA;//定义元素类型
typedef struct ChainTree//定义二叉树的节点类型
{
    DATA data;//元素数据
    struct ChainTree *left;//左子树节点指针
    struct ChainTree *right;//右子树节点指针
}ChainBinTree;

初始化二叉树

ChainBinTree *BinTreeInit(ChainBinTree *node)//初始化二叉树的根节点
{
    if(node!=NULL)//若二叉树的根节点不为空
        return node;
    else
        return NULL;
}

添加新节点到二叉树

//添加数据到二叉树,bt为父节点,node为子节点,n=1表示添加左子树,n=2表示添加右子树
int BinTreeAddNode(ChainBinTree *bt,ChainBinTree *node,int n)
{
    if(bt==NULL)
    {
        printf("父节点不存在,请先设置父节点!\n");
        return 0;
    }
    switch(n)
    {
        case 1://添加左节点
            if(bt->left)//左子树不为空
            {
                printf("左子树节点不为空!\n");
                return 0;
            }
            else
                bt->left=node;
            break;
        case 1://添加右节点
            if(bt->right)//右子树不为空
            {
                printf("右子树节点不为空!\n");
                return 0;
            }
            else
                bt->right=node;
            break;
        default:
            printf("参数错误!\n");
            return 0;
    }
    return 1;
}

获取左右叉树

ChainBinTree *BinTreeLeft(ChainBinTree *bt)//返回左子结点
{
    if(bt)
        return bt->left;
    else
        return NULL;
}
ChainBinTree *BinTreeRight(ChainBinTree *bt)//返回右子节点
{
    if(bt)
        return bt->right;
    else
        return NULL;
}

获取二叉树的状态

int BinTreeIsEmpty(ChainBinTree *bt)//检查二叉树是否为空,为空则返回1,否则返回0
{
    if(bt)
        return 0;
    else
        return 1;
}

计算二叉树深度

int BinTreeDepth(ChainBinTree *bt)
{
    int dep1,dep2;
    if(bt==NULL)
        return 0;//对于空树,深度为0
    else
    {
        dep1=BinTreeDepth(bt->left);//左子树深度(递归调用)
        dep2=BinTreeDepth(bt->right);//右子树深度(递归调用)
        return dep1>dep2?dep1+1:dep2+1;
    }
}

二叉树查找

ChainBinTree *BinTreeFind(ChainBinTree *bt,DATA data)//在二叉树中查找值为data的节点
{
    ChainBinTree *p;
    if(bt==NULL)
        return NULL;
    else
    {
        if(bt->data==data)
            return bt;
        else
        {//分别向左右子树递归查找
            if(p=BinTreeFind(bt->left,data))
                return p;
            else if(p=BinTreeFind(bt->right,data))
                return p;
            else
                return NULL;
        }
    }
}

清空二叉树

void BinTreeClear(ChainBinTree *bt)//清空二叉树,使之变成一颗空树
{
    if(bt)
    {
        BinTreeClear(bt->left);//清空左子树
        BinTreeClear(bt->right);//清空右子树
        free(bt);//释放当前节点所占的内存
        bt=NULL;
    }
    return;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值