ツリーのC/C++実装

22925 ワード

ツリーのC/C++実装
【クラスBiTreeでの変数コメント】
rootタイプ:BiTree*は、このノードが属するツリーの最上位ルートノードアドレスを格納し、ノード認証にも使用します.多くのメンバー関数はrootが空であるかどうかを検証し、空が正常でないノードであると判断した場合、それを操作せず、プログラムの安定性を保証します.
Dataタイプ:ElemTypeはノードの値を格納、ElemTypeはintがデフォルトであり、BiTreeを変更することができる.cppのtypedefは他のタイプに変更されました.
Lptrタイプ:BiTree*はノードの左サブノードアドレスを格納し、左サブノードが存在しない場合は空です.
Rptrタイプ:BiTree*はノードの右サブノードアドレスを格納し、右サブノードが存在しない場合は空です.
【クラスBiTreeでの関数コメント】
******ツリー操作関数部分************
bool BiTree::InitTree()ツリーを生成し、スタック領域にルートノードを割り当てる
bool BiTree::ClearTree()は、現在のノードをルートとするツリーのすべての値を初期値にリセットし、初期値はマクロ定義で決定します(ElemTypeがintの場合に使用します).
int BiTree::GetSize()現在のノードをルートとするツリーのノード数を取得する
int BiTree::GetDepth()現在のノードをルートとするツリーの深さを取得する
bool BiTree::IsEmptyTree()現在のノードをルートノードとするツリーが空かどうかを判断するとtrueに戻ります
bool BiTree::DestroyTree()現在のノードをルートノードとするツリーを破壊し、すべてのメモリ領域を解放
bool BiTree::ShowTree()は、ツリー全体を順番に呼び出しvisit()で表示します.
bool BiTree::TraverseTree(bool(*F)()、int flag)は木全体を遍歴し、関数Fに従って操作するとflagはPRE_を取ることができるORDER,IN_ORDER,POST_ORDER
*****ノード操作関数部*********
BiTree*BiTree::GetRoot()現在のノードがある(最上位レベル)ツリーのルートノード値を返します.
bool BiTree::Grow()は、現在のノードに2つの新しいサブノードを追加します.左右のサブノードが存在する場合falseが返されます.
bool BiTree::IsParent()は、現在のノードがルートノード(サブノードを持つ)であるかどうかを判断し、Yesはtrueを返します.
ElemType BiTree::GetValue()現在のノードの値を返します.
bool BiTree::visit()出力ウィンドウに現在のノードの値とその左右のサブノードアドレスを出力
bool BiTree::AssignValue(ElemType value)現在のノードのdataにvalueを割り当てる
BiTree*BiTree::LeftChild()現在のノードの左サブノードポインタを返します.
BiTree*BiTree::RightChild()現在のノードの右サブノードポインタを返します.
bool BiTree::InsertRight(BiTree*r)は、入力rが指すノードを現在のノードの左サブノードとする.現在のノードに左サブノードが既に存在する場合、元の左サブノードをrがノードを指す新しい左ノードとして、現在のノードの左側に1つのノードを挿入する機能を実現する.
bool BiTree::InsertLeft(BiTree*l)は、入力lが指すノードを現在のノードの左サブノードとする.現在のノードに左サブノードが既に存在する場合、元の左サブノードをlがノードを指す新しい左ノードとして、現在のノードの左側に1つのノードを挿入する機能を実現する.
bool BiTree::InsertLeft()関数がリロードされ、パラメータが入力されていない場合、現在のノードに新しい左サブノードが追加されます.
bool BiTree::InsertRight()関数がリロードされ、パラメータが入力されていない場合、現在のノードに新しい右サブノードが追加されます.
bool BiTree::DeleteLeft()現在のノードの左サブノードを削除
bool BiTree::DeleteRight()現在のノードの右サブノードを削除する
/****************************************************************
// Binary Tree Using C/C++
// File: BiTree.cpp
// Time: 2017.6.12 14:24
// Author: JayRoxis
*****************************************************************/

#ifndef __BITREE_H__
#define __BITREE_H__

#include 

// Typedef
typedef int ElemType;  //Change the definition of ElemType

// Define class Bitree
typedef class BiTree{
    private:
        BiTree* root;
        ElemType data;
        BiTree* Lptr;
        BiTree* Rptr;

    public:

        // Tree related
        bool InitTree();
        bool DestroyTree();
        bool ResetTree();
        bool ClearTree();
        bool IsEmptyTree();
        bool ShowTree();
        int GetSize();
        int GetDepth();
        bool TraverseTree(bool (*F)(), int flag);

        // Tree nodes related
        bool Grow();
        BiTree* GetRoot();
        bool IsParent();
        ElemType GetValue();
        bool visit();
        bool AssignValue(ElemType value);
        BiTree* LeftChild();
        BiTree* RightChild();
        bool InsertLeft(BiTree* l);
        bool InsertRight(BiTree* r);
        bool InsertLeft();   // OVERLOAD
        bool InsertRight();  // OVERLOAD
        bool DeleteLeft();
        bool DeleteRight();
        BiTree();

} Bitree;

#endif
/****************************************************************
// Binary Tree Using C/C++
// File: BiTree.cpp
// Time: 2017.6.12 14:23
// Author: JayRoxis
*****************************************************************/

#include <stdio.h>
#include "BiTree.h"

#ifndef __BITREE_CPP__
#define __BITREE_CPP__

#define INIT_DATA 0   // Define the initial value of a tree

#define PRE_ORDER 0   // Define the traverse symbol 
#define IN_ORDER 1
#define POST_ORDER 2
#define LEVEL_ORDER 3


// Initiating
BiTree::BiTree():root(NULL),data(INIT_DATA),Lptr(NULL),Rptr(NULL){};

/************* Tree related function definition ******************/

// Initiate a binary tree, create the root node
bool BiTree::InitTree(){
    root = (BiTree *)malloc(sizeof(BiTree));
    if (!root)
        return false;
    return true;
} 


// Destroy the binary tree
bool BiTree::DestroyTree(){
    if (root)
        if (ResetTree()){
            free(root);
            root = NULL;
            return true;
        }
    return false;
}


// Reset the binary tree
bool BiTree::ResetTree(){
    if (root){
        if (Lptr){
            Lptr->ResetTree();
            DeleteLeft();
        }
        if (Rptr){
            Rptr->ResetTree();
            DeleteRight();
        }
        return true;
    }
    root->data = 0;
    return false;
}


// Clear the binary tree
bool BiTree::ClearTree(){
    if (root)
        if (AssignValue(INIT_DATA)){
            if (Lptr)
                Lptr->AssignValue(INIT_DATA);
            if (Rptr)
                Rptr->AssignValue(INIT_DATA);
            return true;
        }
    return false;
}


// Determine if the tree is empty
bool BiTree::IsEmptyTree(){
    if (root->Lptr || root->Rptr)
        return false;
    return true;
}


// Traverse the tree
bool BiTree::TraverseTree(bool (*F)(), int flag){
    if (root)
            switch (flag){
            case PRE_ORDER:         // PreOrder
                if (!F())
                    return false;
                if (Lptr)
                    if (!TraverseTree(F, flag))
                        return false;
                if (Rptr)
                    if (!TraverseTree(F, flag))
                        return false;
                return true;
                break;
            case IN_ORDER:          // InOrder              
                if (Lptr)
                    if (!TraverseTree(F, flag))
                        return false;
                if (!F())
                    return false;
                if (Rptr)
                    if (!TraverseTree(F, flag))
                        return false;
                break;
            case POST_ORDER:        // PostOrder
                if (Lptr)
                    if (!TraverseTree(F, flag))
                        return false;
                if (Rptr)
                    if (!TraverseTree(F, flag))
                        return false;
                if (!F())
                        return false;
                return true;
                break;
            case LEVEL_ORDER:       // LevelOrder
                break;
            default:
                return false;

            }
    return false;
}


// Show all the element of the tree
bool BiTree::ShowTree(){
    if (root)
        if (AssignValue(INIT_DATA)){
            if (Lptr)
                Lptr->ShowTree();
            if (Rptr)
                Rptr->ShowTree();
            visit();
            return true;
        }
    return false;
}


// Get the size of the tree
int BiTree::GetSize(){
    if (!root)
        return 0;
    return (Lptr != NULL) * Lptr->GetSize() + (Rptr != NULL) * Rptr->GetSize() + 1;
}


// Get the depth of the tree
int BiTree::GetDepth(){
    if (!root)
        return 0;
    int l = (Lptr != NULL) * Lptr->GetDepth();
    int r = (Rptr != NULL) * Rptr->GetDepth();
    return (l>=r)*l + (r>l)*r + 1;
}


/**************** Node related function definition ******************/

// Get the root of the tree
BiTree* BiTree::GetRoot(){
    return root;
}

// Create a node to a existed tree
bool BiTree::Grow(){
    if (!root)
        return false;
    if (!InsertLeft())
        if (!InsertRight())
            return false;
    return true;
}


// Determine if the node has children
bool BiTree::IsParent(){
    if (Lptr||Rptr)
        return true;
    return false;
}


// Get the value of the node
ElemType BiTree::GetValue(){
    if (!root)
        return false;
    return data;
}


// Print the value of node
bool BiTree::visit(){
    if (!root)
        return false;
    if ((Lptr)||(Rptr))
        printf("%d(%x,%x)
"
,data,Lptr,Rptr); else printf("%d
"
,data); return true; } // Assign value to the node bool BiTree::AssignValue(ElemType value){ if (!root) return false; data = value; if (!data == value) return false; return true; } // Get left child of the node BiTree* BiTree::LeftChild(){ return Lptr; } // Get right child of the node BiTree* BiTree::RightChild(){ return Rptr; } // Insert/Append an existed node as left child bool BiTree::InsertLeft(BiTree* l){ if ((!root)||(!l)) return false; if (Lptr){ l->Lptr = Lptr; } Lptr = l; l->root = root; return true; } // Insert/Append an existed node as right child bool BiTree::InsertRight(BiTree* r){ if ((!root)||(!r)) return false; if (Rptr){ r->Rptr = Rptr; } Rptr = r; r->root = root; return true; } // OVERLOAD: Insert/Append an new node as left child bool BiTree::InsertLeft(){ if ((!root)||(Lptr)) return false; Lptr = (BiTree *)malloc(sizeof(BiTree)); return true; } // OVERLOAD: Insert/Append an new node as right child bool BiTree::InsertRight(){ if ((!root)||(Rptr)) return false; Rptr = (BiTree *)malloc(sizeof(BiTree)); return true; } // Delete left child of the node bool BiTree::DeleteLeft(){ if ((!root)||(!Lptr)) return false; free(Lptr); Lptr = NULL; return true; } // Delete right child of the node bool BiTree::DeleteRight(){ if ((!root)||(!Rptr)) return false; free(Rptr); Rptr = NULL; return true; } #endif