算法导论-----二叉搜索树
来源:互联网 发布:淘宝帐号注销2017 编辑:程序博客网 时间:2024/05/16 08:36
#include <iostream>using namespace std;typedef struct Node{ int value; struct Node * parent; struct Node * right; struct Node * left;}NODE,*NODE_POINT;class Tree{private: //根节点 NODE_POINT root; //替换过程 void TRANSPLANT(NODE_POINT old_elem,NODE_POINT new_elem); //删除所有元素 void TREE_DELETE_ALL(NODE_POINT node); public: Tree(); ~Tree(); //inorder tree walk void INORDER_TREE_WALK(NODE_POINT x); void INORDER_TREE_WALK(); NODE_POINT TREE_SEARCH(NODE_POINT x,int k); NODE_POINT TREE_SEARCH(int k); NODE_POINT TREE_MINIMUM(); NODE_POINT TREE_MINIMUM(NODE_POINT x); NODE_POINT TREE_MAXIMUM(); NODE_POINT TREE_MAXIMUM(NODE_POINT x); //后继节点 NODE_POINT TREE_SUCCESSOR(NODE_POINT x); void TREE_INSERT(int x); void TREE_DELETE(NODE_POINT x);};Tree::Tree():root(NULL){}void Tree::INORDER_TREE_WALK(NODE_POINT x){ if(x!=NULL) { //左子树 INORDER_TREE_WALK(x->left); cout<<x->value<<" "; //右子树 INORDER_TREE_WALK(x->right); }}void Tree::INORDER_TREE_WALK(){ INORDER_TREE_WALK(root);}NODE_POINT Tree::TREE_SEARCH (NODE_POINT x,int k){ if(x==NULL||k==x->value) { return x; } if(k<(x->value)) { return TREE_SEARCH(x->left,k); } else { return TREE_SEARCH(x->right,k); }}NODE_POINT Tree::TREE_SEARCH(int k){ return TREE_SEARCH(root,k);}NODE_POINT Tree::TREE_MINIMUM(NODE_POINT x){ if(x!=NULL) { while(x->left!=NULL) { x=x->left; } } return x;}NODE_POINT Tree::TREE_MINIMUM(){ return TREE_MINIMUM(root);}NODE_POINT Tree::TREE_MAXIMUM(){ return TREE_MAXIMUM(root);}NODE_POINT Tree::TREE_MAXIMUM(NODE_POINT x){ if(x!=NULL) { while(x->right!=NULL) { x=x->right; } } return x;}NODE_POINT Tree::TREE_SUCCESSOR(NODE_POINT x){ //右孩子不为空 if(x->right!=NULL) { return TREE_MINIMUM(x->right); } else { NODE_POINT y; y=x->parent; //右孩子为空,且自身为父节点右孩子 //(当为左孩子时,父节点为其后继节点,直接返回父节点) while(y!=NULL&&x==y->right) { //当x位于根节点的右子树中,y最终为NULL x=y; y=y->parent; } return y; }}void Tree::TREE_INSERT(int x){ //树为空,插入的为根节点 if(root==NULL) { root=(NODE_POINT)malloc(sizeof(NODE)); root->value=x; root->parent=NULL; root->left=NULL; root->right=NULL; } else { //node作为要插入的位置 NODE_POINT node,node_parent; node=root; while(node!=NULL) { node_parent=node; if(x<node->value) { node=node->left; } else { node=node->right; } } node=(NODE_POINT)malloc(sizeof(NODE)); node->value=x; node->left=NULL; node->right=NULL; node->parent=node_parent; if(node->value<node_parent->value) { node_parent->left=node; } else { node_parent->right=node; } }}void Tree::TRANSPLANT(NODE_POINT old_elem,NODE_POINT new_elem){ if(old_elem->parent==NULL) { root=new_elem; if(new_elem!=NULL) new_elem->parent=NULL; } else if(old_elem==old_elem->parent->left) { //将老节点的父节点的左孩子指向新节点 old_elem->parent->left=new_elem; } else { //将老节点的父节点的右孩子指向新节点 old_elem->parent->right=new_elem; } if(new_elem!=NULL) { //将新节点的父加点指向老节点的父节点 new_elem->parent=old_elem->parent; }}void Tree::TREE_DELETE(NODE_POINT x){ if(x->left==NULL) { TRANSPLANT(x,x->right); } else if(x->right==NULL) { TRANSPLANT(x,x->left); } else { //寻找x的后继节点elem(肯定位于x的右子树中) NODE_POINT elem=TREE_SUCCESSOR(x); //elem不是x的右孩子 if(elem->parent!=x) { //用elem的右孩子替代elem的位置 TRANSPLANT(elem,elem->right); //处理x的右孩子 elem->right=x->right; elem->right->parent=elem; } //用elem替代x的位置 TRANSPLANT(x,elem); //处理x的左孩子 elem->left=x->left; elem->left->parent=elem; }}void Tree::TREE_DELETE_ALL(NODE_POINT node){ if(node!=NULL) { TREE_DELETE_ALL(node->left); if(node->right!=NULL) { TREE_DELETE_ALL(node->right); } free(node); }}Tree::~Tree(){ TREE_DELETE_ALL(root);}