C版本的二叉樹

一個普通C版本的二叉樹,很早以前實現的,就供新手隨便看看吧!

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;

struct TreeNode{
    int data;
    TreeNode * leftChild;
    TreeNode * rightChild;
};



void insertTreeNode( TreeNode ** node, int data )
{
    if( *node == NULL ) {
        *node = (TreeNode*)malloc( sizeof( TreeNode ) );
        (*node)->leftChild = NULL;
        (*node)->rightChild = NULL;
        (*node)->data = data;
        return;
    }

    if( data < (*node)->data )
        insertTreeNode( &(*node)->leftChild, data );
    else
        insertTreeNode( &(*node)->rightChild, data );
}

void travel( TreeNode * node )
{
    if( node != NULL ) {
        travel( node->leftChild );
        cout << node->data << " ";
        travel( node->rightChild );
    }
}

void travelInPrev( TreeNode * node )
{
    if( node != NULL ) {
        cout << node->data << " ";
        travelInPrev( node->leftChild );
        travelInPrev( node->rightChild );
    }
}

TreeNode ** find( TreeNode ** root, int data )
{
    if( *root == NULL ) return NULL;

    if( (*root)->data < data )
        return find( &(*root)->rightChild, data );
    else if( (*root)->data > data )
        return find( &(*root)->leftChild, data );
    else
        return root;
}

TreeNode * findParent( TreeNode * root, TreeNode * node )
{
    if( root == NULL ) return NULL;

    if( root->leftChild->data < node->data)
        return findParent( root->rightChild, node );
    else if( root->rightChild->data > node->data )
        return findParent( root->leftChild, node );
    else
        return root;
}

TreeNode * findMax( TreeNode * root )
{
    if( root == NULL ) return NULL;

    while( root->rightChild != NULL )
        root = root->rightChild;
    return root;
}

void erase( TreeNode ** root, int data )
{
    TreeNode ** node = find( root, data );

    // 若這個節點存在,則進行真正的刪除操作
    if( *node != NULL ) {
        // 若被刪節點不存在左子樹,則直接以右子樹替代被刪節點
        if( (*node)->leftChild == NULL ) {
            TreeNode * tmp = *node;
            (*node) = (*node)->rightChild;
            free( tmp );
        } else { // 找到被刪節點的左子樹最大節點,然後將右子樹連接爲最大節點的右子樹即可
            TreeNode * maxNode = findMax( (*node)->leftChild );
            maxNode->rightChild = (*node)->rightChild;
            TreeNode * tmp = *node;
            (*node) = (*node)->leftChild;
            free( tmp );
        }
    } else {
        cout << "The Node is not exist!!!" << endl;
    }
}

// 獲取樹的全部節點數目
int size( TreeNode * root )
{
    if( root == NULL ) return 0;
    if( root->leftChild == NULL && root->rightChild == NULL ) return 1;

    int treeSize = 1; // 只要節點不爲空,則其本身就該記長度爲1
    treeSize += size( root->leftChild ) + size( root->rightChild );

    return treeSize;
}

// 獲取樹的深度
int depth( TreeNode * root )
{
    if( root == NULL ) return 0;

    int leftDepth = 1 + depth( root->leftChild );
    int rightDepth = 1 + depth( root->rightChild );

    return ( leftDepth > rightDepth ? leftDepth : rightDepth );
}

// 獲取葉子節點的個數
int leaf( TreeNode * root )
{
    if( root == NULL ) return 0;
    if( root->leftChild == NULL && root->rightChild == NULL ) return 1;

    int leafSize = 0;
    leafSize = leaf( root->leftChild ) + leaf( root->rightChild );

    return leafSize;
}

// 更新節點的值
bool update( TreeNode ** root, int newData, int origData )
{
    TreeNode ** node = find( root, origData );
    if( *node == NULL ) return false;

    erase( root, origData );
    insertTreeNode( root, newData );

}

int main(int argc, char *argv[])
{
    TreeNode * root = NULL;
    insertTreeNode( &root, 3 );
    insertTreeNode( &root, 2 );
    insertTreeNode( &root, 1 );
    insertTreeNode( &root, 4 );
    insertTreeNode( &root, 100 );
    insertTreeNode( &root, 10 );
    insertTreeNode( &root, 7 );
    insertTreeNode( &root, 70 );
    insertTreeNode( &root, 120 );
    cout << "The raw data : " << endl;
    travel( root );
    cout << endl;

    cout << "The Tree Size is " << size( root ) << endl;
    cout << "The Tree Depth is " << depth( root ) << endl;
    cout << "The Tree's Leaf Size is " << leaf( root ) << endl;

    printf( "%d\n", (*find( &root, 100 ))->data );
    cout << "After erase 4 the data : " << endl;
    erase( &root, 4 );
    travel( root );
    cout << endl;

    cout << "After erase 10 the data : " << endl;
    erase( &root, 10 );
    travel( root );
    cout << endl;

    cout << "The Root's max node : "  << endl;
    cout << findMax( root )->data << endl;

    cout << "After erase 100 the data : " << endl;
    erase( &root, 100 );
    travel( root );
    cout << endl;

    cout << "The Tree Size is " << size( root ) << endl;
    cout << "The Tree Depth is " << depth( root ) << endl;
    cout << "The Tree's Leaf Size is " << leaf( root ) << endl;

    cout << "The Previous Travel is : " << endl;
    travelInPrev( root );
    cout << endl;

    cout << "update 3 to 200 " << endl;
    update( &root, 200, 3 );
    travel( root );
    cout << endl;

    return 0;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章