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