美文网首页
二叉树:遍历、搜索

二叉树:遍历、搜索

作者: MachinePlay | 来源:发表于2019-10-07 23:59 被阅读0次

    二叉树

    递归方法太简单了,这里就贴上几种不同的非递归实现,前中后

    //iteration traverse
    //travePreIterTail
    template<typename T> template <typename VST>
    void BinTree<T>::travePreIterTail(BinNodePosi(T) x, VST &visit){
        std::stack<BinNodePosi(T)> preStack;
        preStack.push(x);
        while(!preStack.empty()){
            BinNodePosi(T) ret=preStack.top();
            preStack.pop();
            visit(ret->data);
            if(ret->rchild){
                preStack.push(ret->rchild);
            }
            if(ret->lchild){
                preStack.push(ret->lchild);
            }
        }
    }
    
    
    
    //traverseIter
    template <typename T> template<typename VST>
    void BinTree<T>::travePreIterLeft(BinNodePosi(T) x, std::stack<BinNodePosi(T)> &S, VST& visit){
        while(x){
            visit(x->data);
            if(x->rchild){
                S.push(x->rchild);
            }
                x=x->lchild;
        }
    
    }
    
    template <typename T> template <typename VST>
    void BinTree<T>::traverPreIter(BinNodePosi(T) x,VST& visit){
        std::stack<BinNodePosi(T)> S;
        while(true){
            travePreIterLeft(x,S,visit);
            if(S.empty()){break;}
            else{
            x=S.top();
            S.pop();
            }
        }
    
    }
    
    template <class T> 
    void BinTree<T>::traverInIterLeft(BinNodePosi(T) x,std::stack<BinNodePosi(T)> &S){
        while(x){
            S.push(x);
            x=x->lchild;
        }
    }
    
    template <class T> template <class VST>
    void BinTree<T>::traverInIterV1(BinNodePosi(T) x,VST& visit){
        std::stack<BinNodePosi(T)> S;
        while(true){
            traverInIterLeft(x,S);
            if(S.empty()) break;
            x=S.top();
            visit(x->data);
            S.pop();
            x=x->rchild;
        }
    }
    
    template <typename T> template <typename VST>
    void BinTree<T>::traverInIterV2(BinNodePosi(T) x,VST& visit){
        std::stack<BinNodePosi(T)> S;
        while(true){
        if(x){
            S.push(x);
            x=x->lchild;
        }
        else if(!S.empty()){
            x=S.top();
            S.pop();
            visit(x->data);
                x=x->rchild;
        }
        else {
            break;
        }
        }
    }
    
    template <typename T> template<typename VST>
    void BinTree<T>::traverInIterV3(BinNodePosi(T) x, VST& visit){
        while(HasLChild((*x))){
            x=x->lchild;
        }
        while(true){
                visit(x->data);
                x=x->succ();
                if(!x){
                    break;
                }
        }
    }
    
    
    //direct succ of InTraverse
    template<class T>
    BinNodePosi(T) BinNode<T>::succ(){
        BinNodePosi(T) directSuccPoint=this;
        if(rchild){
            directSuccPoint=rchild;
            while(HasLChild((*directSuccPoint))){
                directSuccPoint=directSuccPoint->lchild;
            }
        }
        else{
            while((directSuccPoint!=nullptr)&&(IsRChild((*directSuccPoint)))){
                directSuccPoint= directSuccPoint->parent;
            }
            if(directSuccPoint!=nullptr){
            directSuccPoint=directSuccPoint->parent;
            }
        }
        return directSuccPoint;
    }
    
    //
    template <class T>
    void BinTree<T>::traversePostLeft(std::stack<BinNodePosi(T)> &S){
        while(BinNodePosi(T) temp=S.top()){
            if(HasLChild((*temp))){
                if(HasRChild((*temp))){
                    S.push(temp->rchild);
                }
                S.push(temp->lchild);
            }
            else{
                //if(temp->rchild) can't  because the last top elem must be nullptr
                S.push(temp->rchild);
            }
        }
        S.pop();//pop the nullptr
    } 
    template <typename T> template <typename VST>
    void BinTree<T>::traverPostIter(BinNodePosi(T) x, VST& visit){
        std::stack<BinNodePosi(T)> S;
        if(x)
        S.push(x);
        while(!S.empty()){
            if(S.top()!=x->parent){
                traversePostLeft(S);
            }
            x=S.top();
            S.pop();
            visit(x->data);
        }
    }
    
    template <typename T>
    void static preShow(BinTree<T> &tree){
        show<T> preTemp;
        tree.traverPreIter(tree.root(),preTemp);
        //tree.travePre_R(tree.root(),preTemp);
    }
    
    
    template<typename T>
    void static inShow(BinTree<T> &tree){
        show<T> inTemp;
        tree.traverInIterV2(tree.root(),inTemp);
    }
    
    template <typename T>
    void static postShow(BinTree<T> &tree){
        show<T> postTemp;
        tree.traverPostIter(tree.root(),postTemp);
    }
    

    相关文章

      网友评论

          本文标题:二叉树:遍历、搜索

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