二叉树:二叉链表

来源:互联网 发布:免费会员软件 编辑:程序博客网 时间:2024/05/29 17:44
//二叉树的顺序存储适用于完全二叉树 
//本文采用二叉链表存储:删除插入、遍历、查找parent和sibling等操作#ifdef _BITNODE_H#define _BITNODE_H#include<assert.h>#include<stack>//结点的结构体 template<class T>struct BiTNode{T data;BiTNode<T> *lchild,*rchild;}; enum Tags{Left,Right};enum style{Pre,In,Post}; //枚举变量template <classT>struct StackElem{BiTNode<T> *p;Tags flag;}; //模板类 template<class T> class BiTree{protected:BiTNode<T> *root;//只想二叉树的根节点,类似于头指针 private://递归:后序销毁 void DestroyBiTree(BiTNode<T> *&t){if(t){DestroyBiTree(t->lchild);DestroyBiTree(t->rchild);delete t;t=NULL;} }public://////////////////////////////////////    BiTree(){    root=NULL;}~BiTree(){DestroyBiTree(root);}BiTNode<T> *Root(){return root;}bool BiTreeEmpty() const{    return root==NULL;}int BiTreeDepth(BiTNode<T> *t) const{int i,j;if(t==NULL) return 0;i=BiTreeDepth(t->lchild);j=BiTreeDepth(t->rchild);return i>j? i+1 : j+1; }/////////////////////////////////////////////////////////////////////////////////////////////// //先序输入不能直接确定二叉树的形状 void CreateBiTreeFromFile(ifstream &f){ //先序建立 :先序输入。度为1 的结点和叶子的空指针也要输入 T e; f>>e;if(e==Nil) return;root=new BiTNode<T>;assert(root!=NULL);root->data=e;BiTree<T> son;son.CreateFromFile(f);root->lchild=son.root;son.root=NULL;son.CreateFromFile(f);root->rchild=son.root;son.root=NULL;  }//递归遍历 void OrderTraverse(BiTNode<T> *t,style mode,void(*visit)(BiTNode<T>&)) const{if(t){if(mode==Pre) visit(*t);OrderTraverse(t->lchild,mode,visit);if(mode==In)  visit(*t);OrderTraverse(t->rchild,mode,visit);if(mode==Post)visit(*t);}}//利用栈非递归遍历 void PreOrderTraverse(void (*visit)(BiTNode<T>&)) const{stack<BiTNode<T>*> s;    BiTNode<T> *t=root;    s.push(NULL);  //先压入一个空指针,作为标记     while(t){    visit(*t);    if(t->rchild) s.push(t->rchild);    if(t->lchild) t=t->lchild;    else{ //直至走到左的尽头后处理右指针     t=s.top();    s.pop();}}}void InOrderTraverse(void (*visit)(BiTNode<T>&)) cons{    stack<BiTNode<T>*> s;BiTNode<T> *t=root;  while(t || !s.empty()){if(t){s.push(t);t=t->lchild;}else{t=s.top();s.pop();visit(*t);t=t->rchild;}}cout<<endl;} void PostOrderTraverse(void (*visit)(BiTNode<T>&)) const{    StackElem<T> se;stack<StackElem>> s;BiTNode<T>* t=root;if(t==NULL) return;while(!s.empty()|| t){while(t){se.p=t;  se.flag=Left;s.push(se);t=t->lchild;}se=s.top();  s.pop();t=se.p;if(se.flag==Left){se.flag=Right;s.push(se);t=t->rchild;}else{visit(*t);t=NULL;}} }
                //层序遍历:利用队列的先进先出特性 STLvoid LevelOrderTraverse(void (*visit)(BiTNode<T>&)) const{queue<BiTNode<T>*> q;BiTNode<T> *a,*t=root;if(t){q.push(t);while(!q.empty()){a=q.front();   q.pop();visit(*a);if(a->lchild)  q.push(a->lchild); if(a->rchild)  q.push(a->rchild);}}    cout<<endl;}//////////////////////////////插入  删除  ////////////////////////////////////////////////////////////////bool InsertChild(BiTNode<T> *&p,bool LR,BiTree<T> &c){BiTNode<T> *q=c.root;if(p){if(!LR){q->rchild=p->lchild;p->lchild=q;}else{q->rchild=p->rchild;p->rchild=q;}return true;}return false;}bool DeleteChild(BiTNode<T>* &p, bool LR){if(p){if(!LR) DestroyBiTree(p->lchild);else DestroyBiTree(p->rchild);return true; }return false;}T Value(BiTNode<T> *p) const{     return p->data;}void Assign(BiTNode<T>* p,T value) const{p->data=value;}    //////////////////////////////查找:利用queue容器,实现队列操作//////////////////////////////////////////////////////////////////    BiTNode<T>* Parent(BiTNode<T> *p) const{queue<BiTNode<T>*> q;BiTNode>T> *a,*t=root;q.push(t);while(!q.empty()){a=q.front();  q.pop();if(a->lchild && a->lchild==p) return a;else q.push(a->lchild); if(a->rchild && a->rchild==p) return a; else q.push(a->rchild);}} void Child(BiTNode<T>* p,BiTNode<T> *&left,BiTNode<T> *& right) const{left=p->lchild;right=p->rchild;}bool Sibling(BiTNode<T>*p,BiTNode<T>*&sib,loo &LR) const{    BiTNode<T> *a=Parent(p);    if(a==NULL) return false;    if(a->lchild==p){    sib=p->rchild; LR=true;}else{sib=p->lchild; LR=false; }return sib!=NULL;}}; #endif

0 0
原创粉丝点击