二叉树实现

作者: 丿feng | 来源:发表于2018-11-07 18:37 被阅读0次

    二叉树实现(C++)

    二叉树真是磨人,历时两天才勉强写出了一个较为完整的二叉树及算法

    废话不说,源码如下:

    #ifndef _BINARYTREE_H_
    #define _BINARYTREE_H_
    #include <iostream>
    #include <stack>
    
    template<class T>
    class BinTreeNode {
    public:
      T data;
      BinTreeNode<T> *leftChild;
      BinTreeNode<T> *rightChild;
      // BinTreeNode<T> *parent;
      BinTreeNode(){
        leftChild=NULL;
        rightChild=NULL;
      }
      BinTreeNode(T x,BinTreeNode<T> *left=NULL,BinTreeNode<T> *right=NULL){
        data=x;
        leftChild=left;
        rightChild=right;
      }
      BinTreeNode(BinTreeNode<T> &s){
        data=s->data;
        leftChild=s.leftChild;
        rightChild=s.rightChild;
      }
      friend bool equal(BinTreeNode<T> *p,BinTreeNode<T> *q){
        if (p==NULL && q==NULL) {
          return true;
        }
        bool flag=(p!=NULL)&&(q!=NULL)&&(p->data==q->data)&&(equal(p->leftChild,q->leftChild))&&
                  (equal(p->rightChild,q->rightChild));
        if (flag) {
          return true;
        } else {
          return false;
        }
      }
    };
    
    template<class T>
    class StackNode {
    public:
      BinTreeNode<T> *ptr;
      bool tag;
      StackNode():ptr(NULL){}
      StackNode(BinTreeNode<T> *p=NULL):ptr(p),tag(1){}
      virtual ~StackNode (){}
    };
    
    template<class T>
    class BinaryTree {
    protected:
      BinTreeNode<T> *root;//根指针
      T RefValue;//数据输入停止标志
    
    public:
      BinaryTree ():root(NULL){}//构造函数
      BinaryTree(T value):RefValue(value),root(NULL){}//构造函数
      BinaryTree(BinaryTree<T> &s){root=copy(s.root);}//复制构造函数
      virtual ~BinaryTree (){remove(root);}//析构函数
      bool isEmpty(){return (root==NULL)?true:false;}//判断二叉树是否为空
      BinTreeNode<T> *Parent(BinTreeNode<T> *current){
        return (root==NULL||root==current)?NULL:Parent(root,current);
      }//返回父节点
      BinTreeNode<T> *getLeftChild(BinTreeNode<T> *current){
        return (current!=NULL)?current->leftChild:NULL;
      }//返回左子女
      BinTreeNode<T> *getRightChild(BinTreeNode<T> *current){
        return (current!=NULL)?current->rightChild:NULL;
      }//返回右子女
      BinTreeNode<T> *getRoot()const{return root;}//返回根结点
      int getHeight(){return getHeight(root);}//计算树高度
      int getSize(){return getSize(root);}//计算结点数
      bool search(T item){search(root,item);}//查找
      void input(){input(root);}//前序遍历输入
      void output(){output(root);}//前序遍历输出
      friend bool operator==(const BinaryTree<T> &p,const BinaryTree<T> &q){return (equal(p.root,q.root))?true:false;}//重载==
      friend bool operator!=(const BinaryTree<T> &p,const BinaryTree<T> &q){return (equal(p.root,q.root))?false:true;}//重载!=
      friend std::istream &operator>>(std::istream &is,BinaryTree<T> *p){input();}//前序遍历输入
      friend std::ostream &operator<<(std::ostream &os,BinaryTree<T> *p){output();}//前序遍历输出
      void preOrder(void (*visit)(BinTreeNode<T> *p)){preOrder(root,visit);}//前序遍历
      void inOrder(void (*visit)(BinTreeNode<T> *p)){inOrder(root,visit);}//中序遍历
      void postOrder(void (*visit)(BinTreeNode<T> *p)){postOrder(root,visit);}//后序遍历
      void exchangeLeftandRight(){exchangeLeftandRight(root);}//左右子树交换
    
    protected:
      BinTreeNode<T> *Parent(BinTreeNode<T> *subTree,BinTreeNode<T> *current);//返回父节点
      int getHeight(BinTreeNode<T> *subTree);//计算树高度
      int getSize(BinTreeNode<T> *subTree);//计算结点数
      void remove(BinTreeNode<T> *&subTree);//删除
      bool search(BinTreeNode<T> *subTree,T item);//查找
      BinTreeNode<T> *copy(BinTreeNode<T> *subTree);//复制
      void input(BinTreeNode<T> *&subTree);//前序遍历输入
      void output(BinTreeNode<T> *subTree);//先序遍历输出
      void preOrder(BinTreeNode<T> *subTree,void (*visit)(BinTreeNode<T> *p));//前序遍历
      void inOrder(BinTreeNode<T> *subTree,void (*visit)(BinTreeNode<T> *p));//中序遍历
      void postOrder(BinTreeNode<T> *subTree,void (*visit)(BinTreeNode<T> *p));//后序遍历
      void exchangeLeftandRight(BinTreeNode<T> *subTree);//左右子树交换
    };
    
    
    template<class T>
    BinTreeNode<T> *BinaryTree<T>::Parent(BinTreeNode<T> *subTree,BinTreeNode<T> *current){
      if (subTree==NULL) {
        return NULL;
      }
      if (subTree->leftChild==current||subTree->rightChild==current) {
        return subTree;
      }
      BinTreeNode<T> *p;
      if ((p=Parent->leftChild!=NULL)) {
        return p;
      } else {
        return Parent(subTree->rightChild,current);
      }
    }
    
    template<class T>
    int BinaryTree<T>::getHeight(BinTreeNode<T> *subTree){
      if (subTree==NULL) {
        return 0;
      } else {
        int lh=getHeight(subTree->leftChild);
        int rh=getHeight(subTree->rightChild);
        return ((lh>rh)?lh:rh)+1;
      }
    }
    
    template<class T>
    int BinaryTree<T>::getSize(BinTreeNode<T> *subTree){
      if (subTree==NULL) {
        return 0;
      } else {
        return getSize(subTree->leftChild)+getSize(subTree->rightChild)+1;
      }
    }
    
    template<class T>
    void BinaryTree<T>::remove(BinTreeNode<T> *&subTree){
      if (subTree!=NULL) {
        remove(subTree->leftChild);
        remove(subTree->rightChild);
        delete subTree;
      }
    }
    
    template<class T>
    bool BinaryTree<T>::search(BinTreeNode<T> *subTree,T item){
      if (subTree!=NULL) {
        return subTree->data==item || search(subTree->leftChild,item) || search(subTree->rightChild,item);
      }
    }
    
    template<class T>
    BinTreeNode<T> *BinaryTree<T>::copy(BinTreeNode<T> *subTree){
      if (subTree==NULL) {
        return NULL;
      } else {
        BinTreeNode<T> *p=subTree;
        return p;
      }
    }
    
    template<class T>
    void BinaryTree<T>::input(BinTreeNode<T> *&subTree){
      T item;
      std::cin >> item;
      if (item!=RefValue) {
        subTree=new BinTreeNode<T>(item);
        if (subTree==NULL) {
          std::cerr << "存储分配错误" << '\n';
          exit(1);
        }
        input(subTree->leftChild);
        input(subTree->rightChild);
      } else {
        subTree==NULL;
      }
    }
    
    template<class T>
    void BinaryTree<T>::output(BinTreeNode<T> *subTree){
      if (subTree!=NULL) {
        std::cout << subTree->data << " ";
        output(subTree->leftChild);
        output(subTree->rightChild);
      }
    }
    
    // template<class T>//前序遍历递归实现
    // void BinaryTree<T>::preOrder(BinTreeNode<T> *subTree, void (*visit)(BinTreeNode<T> *p)){
    //   if (subTree!=NULL) {
    //     visit(subTree);
    //     preOrder(subTree->leftChild,visit);
    //     preOrder(subTree->rightChild,visit);
    //   }
    // }
    
    // template<class T>//中序遍历递归实现
    // void BinaryTree<T>::inOrder(BinTreeNode<T> *subTree, void (*visit)(BinTreeNode<T> *p)){
    //   if (subTree!=NULL) {
    //     inOrder(subTree->leftChild,visit);
    //     visit(subTree);
    //     inOrder(subTree->rightChild,visit);
    //   }
    // }
    
    // template<class T>//后序遍历递归实现
    // void BinaryTree<T>::postOrder(BinTreeNode<T> *subTree, void (*visit)(BinTreeNode<T> *p)){
    //   if (subTree!=NULL) {
    //     postOrder(subTree->leftChild,visit);
    //     postOrder(subTree->rightChild,visit);
    //     visit(subTree);
    //   }
    // }
    
    template<class T>//前序遍历非递归实现
    void BinaryTree<T>::preOrder(BinTreeNode<T> *subTree, void (*visit)(BinTreeNode<T> *p)){
      std::stack<BinTreeNode<T>*> s;
      BinTreeNode<T> *p=subTree;
      s.push(p);
      while (!s.empty()) {
        p=s.top();
        visit(p);
        s.pop();
        if (p->leftChild!=NULL) {
          s.push(p->leftChild);
        }
        if (p->rightChild!=NULL) {
          s.push(p->rightChild);
        }
      }
    }
    
    template<class T>//中序遍历非递归实现
    void BinaryTree<T>::inOrder(BinTreeNode<T> *subTree, void (*visit)(BinTreeNode<T> *p)){
      std::stack<BinTreeNode<T>*> s;
      BinTreeNode<T> *p=subTree;
      while (p!=NULL || !s.empty()) {
        while (p!=NULL) {
            s.push(p);
            p=p->leftChild;
        }
        if (!s.empty()) {
          p=s.top();
          visit(p);
          s.pop();
          p=p->rightChild;
        }
      }
    }
    
    template<class T>//后序遍历非递归实现
    void BinaryTree<T>::postOrder(BinTreeNode<T> *subTree, void (*visit)(BinTreeNode<T> *p)){
      std::stack<StackNode<T>> s;
      BinTreeNode<T> *p=subTree;
      StackNode<T> w(NULL);
      bool continueFlag;
      do {
        while (p!=NULL) {
          w=StackNode<T>(p);
          s.push(w);
          p=p->leftChild;
        }
        continueFlag=1;
        while (continueFlag && !s.empty()) {
          w=s.top();
          s.pop();
          p=w.ptr;
          if (w.tag) {
            w.tag=0;
            s.push(w);
            continueFlag=0;
            p=p->rightChild;;
          } else {
            visit(p);
          }
        }
      } while(!s.empty());
    }
    
    template<class T>
    void BinaryTree<T>::exchangeLeftandRight(BinTreeNode<T> *subTree){
      if (subTree!=NULL && (subTree->leftChild!=NULL || subTree->rightChild!=NULL)) {
        BinTreeNode<T> *temp=subTree->leftChild;
        subTree->leftChild=subTree->rightChild;
        subTree->rightChild=temp;
        exchangeLeftandRight(subTree->leftChild);
        exchangeLeftandRight(subTree->rightChild);
      }
    }
    
    #endif
    

    相关文章

      网友评论

        本文标题:二叉树实现

        本文链接:https://www.haomeiwen.com/subject/mfxbxqtx.html