【练习】二叉树的实现

来源:互联网 发布:阿里云投资了多少钱 编辑:程序博客网 时间:2024/05/21 10:25
  • 定义二叉链式结构
#include <stdio.h> #include <stdlib.h> #define QUEUE_MAXSIZE 50typedef 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;}
  • 添加结点到二叉树
int BinTreeAddNode(ChainBinTree *bt,ChainBinTree *node,int n) //添加数据到二叉树 //bt为父结点,node为子结点,n=1表示添加左子树,n=2表示添加右子树 {    if(bt==NULL)    {        printf("父结点不存在,请先设置父结点!\n");        return 0;    }     switch(n)    {        case 1: //添加到左结点             if(bt->left) //左子树不为空             {                printf("左子树结点不为空!\n");                return 0;            }else                bt->left=node;            break;        case 2://添加到右结点            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); //右子树深度 (递归调用)        if(dep1>dep2)           return dep1 + 1;         else            return 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; }
原创粉丝点击