C版本的二叉树

来源:互联网 发布:7天阅卷网络 编辑:程序博客网 时间:2024/05/18 00:41

一个普通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;}


 

原创粉丝点击