二叉查找树的各种操作源码

来源:互联网 发布:域名是世界性的吗 编辑:程序博客网 时间:2024/05/21 11:05
/** * @brief Binary Search Tree  * @author An * @data  2013.6.1                                                                  **/#include <iostream>#include <stack>// start from 0// #define Left( x )  ( 2 * x + 1 )// #define Right( x )  ( 2 * x + 2 )// #define Parent( x )  ( ( x - 1 ) / 2 )using namespace std;typedef struct Node{int data;Node *lchild;Node *rchild;Node *parent;}*BiTree;void CreateBiTree( BiTree &T, int *array ){static int i = -1;++i;if ( array[ i ] == 0 ){T = NULL;}else{T->data = array[ i ];T->lchild = new Node;T->rchild = new Node;T->lchild->parent = T;T->rchild->parent = T;CreateBiTree( T->lchild, array );CreateBiTree( T->rchild, array );}}// recursive in order traversevoid InOrderTraverse( BiTree T ){if ( T != NULL ){InOrderTraverse( T->lchild );cout << T->data << " ";InOrderTraverse( T->rchild );}}// non-recursive in order traversevoid InOrderTraverse_( BiTree T ){stack<Node*> stk;Node *p = T;while ( p != NULL || !stk.empty() ){while ( p != NULL ){stk.push( p );p = p->lchild;}if ( !stk.empty() ){p = stk.top();stk.pop();cout << p->data << " ";p = p->rchild;}}}// recursive search a keyNode* TreeSearch( BiTree T, int k ){if ( T == NULL || T->data == k )return T;if ( T->data < k )return TreeSearch( T->rchild, k );elsereturn TreeSearch( T->lchild, k );}// iterative search a keyNode* TreeSearchIterative( BiTree T, int k ){Node *p = T;while ( p != NULL && k != p->data ){if ( p->data < k )p = p->rchild;elsep = p->lchild;}return p;}// minimum elementNode* TreeMinimum( BiTree T ){Node *p = T;while ( p->lchild != NULL ){p = p->lchild;}return p;}// Maximum elementNode* TreeMaximum( BiTree T ){Node *p = T;while ( p->rchild != NULL )p = p->rchild;return p;}// successorNode* TreeSuccessor( Node *x ){if ( x->rchild != NULL )return TreeMinimum( x->rchild );while ( x != x->parent->lchild ){x = x->parent;}return x->parent;}// predecessorNode* TreePredecessor( Node *x ){if ( x->lchild != NULL )return TreeMaximum( x->lchild );while ( x != x->parent->rchild )x = x->parent;return x->parent;}// Tree insertvoid TreeInsert( BiTree &T, Node *x ){Node *pre = NULL;Node *p = T;while ( p != NULL ){pre = p;if ( x->data < p->data )p = p->lchild;elsep = p->rchild;}x->parent = pre;if ( pre == NULL )T = x;else if ( x->data < pre->data )pre->lchild = x;elsepre->rchild = x;}// Tree insert recursivevoid TreeInsert_( BiTree &T, Node *x ){static Node *pre = NULL;if ( T == NULL ){T = x;x->parent = pre;}else if ( x->data < T->data ){pre = T;TreeInsert_( T->lchild, x );}else{pre = T;TreeInsert_( T->rchild, x );}}// Tree deletevoid TreeDelete( BiTree &T, Node *x ){// 若x最多只有一个子女,则x赋给tmp;否则,x的后继赋给tmpNode *tmp = NULL;if ( x->lchild == NULL || x->rchild == NULL )tmp = x;elsetmp = TreeSuccessor( x );// tmpSucc为它的非空子女,若无子女则为空Node *tmpSucc = NULL;if ( tmp->lchild != NULL )tmpSucc = tmp->lchild;elsetmpSucc = tmp->rchild;// 删除tmp, 修改父指针和子指针if ( tmpSucc != NULL )tmpSucc->parent = tmp->parent;if ( tmp->parent == NULL )T = tmpSucc;else if ( tmp == tmp->parent->lchild )tmp->parent->lchild = tmpSucc;elsetmp->parent->rchild = tmpSucc;// 若删除的是x的后继,将x的后继替换xif ( tmp != x )x->data = tmp->data;delete tmp;}int main(){// PreOrder create tree, 0 indicate NULLint array[] = { 10, 4, 1, 0, 0, 5, 0, 0, 17, 16, 0, 0, 21, 0, 0 };BiTree T = new Node;// Test create tree and in order traverseCreateBiTree( T, array );InOrderTraverse( T );cout << endl;// Test search a elementNode *p1 = new Node;Node *p2 = new Node;p1 = TreeSearch( T, 5 );p2 = TreeSearchIterative( T, 5 );cout << p1->data << " " << p2->data << endl;// Test tree minimum and maximump1 = TreeMinimum( T );p2 = TreeMaximum( T );cout << p1->data << " " << p2->data << endl;// Test successor and predecessorp1 = TreeSearch( T, 5 ); p2 = TreeSearchIterative( T, 5 );p1 = TreeSuccessor( p1 );p2 = TreePredecessor( p1 );cout << p1->data << " " << p2->data << endl;// Test InsertNode *elem = new Node;elem->data = 6;elem->lchild = NULL;elem->rchild = NULL;TreeInsert_( T, elem );InOrderTraverse_( T );cout << endl;// Test DeleteNode *p = TreeSearch( T, 17 );TreeDelete( T, p );InOrderTraverse_( T );cout << endl;return 0;}

原创粉丝点击