【練習】二叉樹的實現

Time-space發表於2017-10-31
  • 定義二叉鏈式結構
#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;
}
  • 新增結點到二叉樹
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; 
}

相關文章