二叉查找树相关

来源:互联网 发布:怎么限制软件联网 编辑:程序博客网 时间:2024/05/19 11:37
<pre style="color: rgb(51, 51, 51); font-size: 13px;">#include <iostream>  struct Tree{//树结构      int key;      Tree *left,*right,*p;  };  // 返回指向树中最大值所在节点  Tree* Tree_max(Tree* rt){      while(rt->right!=nullptr)          rt=rt->right;      return rt;  }  //返回树中最小值所在节点  Tree* Tree_min(Tree* rt){      while(rt->left!=nullptr)          rt=rt->left;      return rt;  }  //返回节点的直接后继节点  Tree* next(Tree *rt){      if(rt->right!=nullptr)          return Tree_min(rt->right);      Tree *x=rt,*y=x->p;      while(y!=nullptr && x==y->right){          x=y;          y=y->p;      }      return y;  }  //返回节点的直接前驱节点  Tree* pre(Tree *rt){      if(rt->left!=nullptr)          return Tree_max(rt->left);      Tree *x=rt,*y=x->p;      while(y!=nullptr && y==x->left){          x=y;          y=y->p;      }      return y;  }//插入节点z,z的左右子树初始化为空void insert(Tree* rt,Tree* z){    Tree* x=rt,y=nullptr;    while(x!=nullptr){        y=x;        if(z->key<x->key)            x=x->left;        else x=x->right;    }    z->p=y;    if(y==nullptr) rt=z;    else if(z->key<y->key)        y->left=z;    else y->right=z;}//用y子树来替换x子树,允许y为空树。用于在删除节点的操作中使用void replace(Tree* x,Tree* y){    if(x->p=nullptr){        rt=y;y->p=nullptr;    }    else if(x==x->p->left){        x->p->left=y;    }    else x->p->right=y;    if(y!=nullptr) y->p=x->p;}//删除节点z,分三种情况解决void Tree_delete(Tree *rt,Tree *z){    if(z->left==nullptr) replace(z,z->right);    else if(z->right==nullptr) replace(z,z->left);    else{        Tree* y=Tree_min(z->right);        if(y->p!=z){            replace(y,y->right);            y->right=z->right;            y->right->p=y;        }        replace(z,y);        y->left=z->left;        y->left->p=y;    }}


0 0
原创粉丝点击