1. 程式人生 > >樹的前、中、後序遍歷演算法(遞迴與非遞迴)、層序遍歷

樹的前、中、後序遍歷演算法(遞迴與非遞迴)、層序遍歷

二叉樹層次遍歷 非遞迴

void  LevelOrder(Tree* T)
{
    if(T == nullptr)
       return ;
    queue<Tree *> myqueue;
    myqueue.push(T);
    while(!myqueue.empty())
    {
        Tree *tmp = myqueue.front();
        if(tmp->leftChild != nullptr)
            myqueue.push(tmp->leftChild);
        if(tmp->rightChild != nullptr)
            myqueue.push(tmp->rightChild);
        cout << tmp.val<<" ";
        myqueue.pop();
    }

}

二叉樹前序遍歷 遞迴 與非遞迴

//遞迴
void  PreOrder(Tree* T)
{
    if(T == nullptr)
       return ;
    cout << T.val << " ";
    PreOrder(T->leftChild);
    PreOrder(T->rightChild);
}


//非遞迴
void preOrderF(Tree * root)
{
    if(root == nullptr)
        return ;
    stack<Tree *>s;
    s.push(root);
    Tree *p = nullptr;
    while(!s.empty())
    {
        p = s.top();
        s.pop();
        cout << p->data << " ";
        if( p->right)
            s.push(p->right);
        if(p->left)
            s.push(p->left);
    }
}

二叉樹中序遍歷 遞迴與非遞迴

//遞迴
void  InOrder(Tree *T)
{
    if(T == nullptr)
       return ;
    InOrder(T->leftChild);
    cout << T.val << " ";
    InOrder(T->rightChild);
}

//非遞迴
void InOrderT(Tree *root){
    if(root == nullptr)
        return ;
    stack<Tree *>s;
    Tree *p = root;
    while(p != nullptr || !s.empty())
    {
        if(p != nullptr)
        {
            s.push(p);
            p = p->left;
        }
        else{
            p = s.top();
            s.pop();
            cout << p->data << " ";
            p = p->right;
        }
    }
}

二叉樹後序遍歷 遞迴與非遞迴

//遞迴
void  PostOrder(Tree* T)
{
    if(T == nullptr)
       return ;
    PostOrder(T->leftChild);
    PostOrder(T->rightChild);
    cout << T.val << " ";
}

//非遞迴
void PostOrderT(Tree *root){
    if(root == nullptr)
        return ;
    stack<Tree *> s;
    vector<int> rs;
    s.push(root);
    Tree *p =nullptr;
    while(!s.empty())
    {
        p = s.top();
        s.pop();;
        rs.insert(rs.begin(),p->data);
        if(p->left)
            s.push(p->left);
        if(p->right)
            s.push(p->right);
    }

    for(int i = 0; i < rs.size(); i++)
        cout << rs[i] << " ";
}