算法导论-----二叉搜索树

来源:互联网 发布:淘宝帐号注销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);}

原创粉丝点击