Bツリーを作成し、動的にノードを追加し、ツリーをトラバースするために、3つのトラバーサルアルゴリズムを使用して

ks17:アップルアルゴリズムbtree_test.c $のCAT 
/// ************************************** ************************************************************ 
/// @filename:btree_test.c 
/// @Brief:Bツリーを構築しようとすると、3つのトラバーサルを使用しますツリートラバーサルアルゴリズム
/// 
/// 
/// @notice:アプリケーションスペースは、関数ポインタにする、割り当ての結果はNULLであるそうでない関数が返し、ポインタモードポインタに割り当てられ、返されていない層をパックする必要があります
@author ///:kuang17 
/// @Last更新日:2019年6月17日18時51分
/// ************************************************************ ************************************** 

の#include "stdio.hの" 
の#include「STDLIB。 H " 
の#include" string.hの「

///定義構造
ツリーノード構造体のtypedef 
{ 
    データINT; 
    TREENODE *親構造体; 
    ツリーノード*のLCHをストラクト、
    TREENODE * Rchの構造体; 
}ツリーノード。

typedefは構造体BtreeData 
{ 
    ツリーノード*ルートノード。
} Bツリー。

///定义参数
構造体BtreeData * m_btree。

///定义函数
のTreeNode * mallocNode(); 
int型initTree(Bツリー* BTREE、INT rootData)。
int型perorderTraversalTree(TreeNodeの*のPNODE)。
int型inorderTraversalTree(TreeNodeの* PNODE)。
postorderTraversalTree(ツリーノード* PNODE)をint型。
int型にaddNode(TreeNodeの*のparentNode、INTあるnewData); 

///主函数
INTメイン(int型ARGC、チャー** ARGV)
{ 
    int型originData [100] = {0、0、0}。
    int型のカウント= 0; 

    //初期化ツリー
    m_btree =(構造体BtreeData *)はmalloc(はsizeof(構造体BtreeData)); 
    initTree(m_btree、ATOI(ARGV [1]))。
    (m_btree->ルートノード!= NULL)の場合
        printf( "ルートデータである:%Dを\ n"、m_btree-> rootNode->データ)。

    //ツリー作成
    チャー入力[12] = "{\ 0}"。
    int型is_end = 1; 
    (is_end)一方
    { 
        取得(入力)。
        printf(入力"入力%S \ nが")。
        IF(strcmpの(入力、 "終了")== 0){ 
            のprintf( "入力を終了します。\ n"); 
            is_end = 0; 
        }他{ 
            //ツリーに追加し
            てaddNode(m_btree->ルートノード、ATOI(入力))。
            originData [カウント++] = ATOI(入力)。
        } 
    } 
    // perorderトラバーサル 
    のprintf( "perorderトラバーサル:
    perorderTraversalTree(m_btree->ルートノード)。


    printf( "トラバーサルINORDERます:\ n"); 
    inorderTraversalTree(m_btree->ルートノード)。

    //後順トラバーサル
    のprintf( "後順トラバーサルます:\ n"); 
    postorderTraversalTree(m_btree->ルートノード)。

    printf( "\のnoriginは次のとおりです。\ nを"); 
    (; iがカウント<I ++は、I = 0をINT)のための
    { 
        のprintf( "%d個の\ n"、originData [I])。
    } 
    のprintf( "終了する\ n"); 
} 

// *********************************************** ********************** 
/// @Brief mallocNode申请空间
/// 
/// @Returns 
// ********** ************************************************** ********* 
    ツリーノード* newNode。
{
    newNode =(ツリーノード*)はmalloc(はsizeof(ツリーノード))。
    newNode->データ= 0。
    newNode->親= NULL; 
    newNode-> LCH = NULL; 
    newNode-> RCH = NULL; 
    newNodeを返します。
} 

// *********************************************** ********************** 
/// @Brief initTree初始化树
/// 
/// @Param BTREE 
/// @Param rootData 
/// 
// / @Returns 
// ********************************************* ************************ 
INT initTree(Bツリー* Bツリー、INT rootData)
{ 
    ツリーノード*ルートノード。
    ルートノード= mallocNode()。
    rootNode->データ=のrootData。
    btree->ルートノード=ルートノード。
    0を返します。
} 

// *********************************************** ********************** 
/// @BriefにaddNode添加节点
/// 
/// @ParamのparentNode 
/// @ParamあるnewData 
/// 
// / @Returns 
// ********************************************* ************************ 
INTにaddNode(ツリーノード*のparentNode、INTあるnewData)
{ 
    ツリーノード* newNode。
    newNode = mallocNode()。
    newNode->データ=あるnewData; 

    IF(あるnewData <= parentNode->データ)
    { 
        のprintf( "親データである:%のD、LCHの\ nを追加"、parentNode->データ)。
        (parentNode-> LCH == NULL)の場合
        {  
            //ここにのみ直接割り当てられていないのparentNode彼のノードの割り当てを与えます
            parentNode-> LCH = newNode。
        }他
        { 
            にaddNode(parentNode-> LCH、あるnewData)。
        } 
    } 

    (あるnewData> parentNode->データ)であれば
    { 
        のprintf( "親データである:%のD、RCHの\ nを追加"、parentNode-を>データ)
        IF(parentNode-> RCH == NULL){ 
            parentNode-> RCH = newNode。
        } {他
            にaddNode(parentNode-> RCH、あるnewData)。
        } 
    } 

    0を返します。
} 

// *********************************************** ********************** 
/// @Brief perorderTraversalTree先序遍历
/// 
/// @Param PNODE
/// 
{ 
/// @Returns
// ************************************************ ********************* 
INT perorderTraversalTree(ツリーノード* PNODE)
{ 
    IF(PNODE == NULL)
        戻り0; 

    perorderTraversalTree(pnode-> LCH); 
    printf( "%d個の\ n"、pnode->データ)。
    perorderTraversalTree(pnode-> RCH); 
    1を返します。
} 


// *********************************************** ********************** 
/// @Brief inorderTraversalTree中序遍历
/// 
/// @Param PNODE 
/// 
/// @Returns 
// ************************************************** ******************* 
int型inorderTraversalTree(TreeNodeの* PNODE)
    (PNODE == NULL)の場合 
        の戻り0; 

    printf( "%d個の\ n"、pnode->データ)。
    inorderTraversalTree(pnode-> LCH); 
    inorderTraversalTree(pnode-> RCH); 
    1を返します。
} 

// *********************************************** ********************** 
/// @Brief postorderTraversalTree后序遍历
/// 
/// @Param PNODE 
/// 
/// @Returns 
// ************************************************** ******************* 
INT postorderTraversalTree(ツリーノード* PNODE)
{ 
    IF(PNODE == NULL)
        戻り0; 

    postorderTraversalTree(pnode-> LCH); 
    postorderTraversalTree(pnode-> RCH);
    printf( "%d個の\ n"、pnode->データ)。
    1を返します。
}

 

おすすめ

転載: www.cnblogs.com/kuang17/p/11041557.html