二叉樹的先序遍歷


如下圖表示一顆二叉樹,對它進行先序遍歷操作,采用兩種方法,遞歸和非遞歸操作。。

遍歷結果為:1245367。

1、遞歸操作:

思想:若二叉樹為空,返回。否則

1)遍歷根節點;2)先序遍歷左子樹;3)先序遍歷右子樹

代碼:

void PreOrder(BiTree root)  
{  
    if(root==NULL)  
        return ;  
    printf("%c ", root->data); //輸出數據  
    PreOrder(root->lchild); //遞歸調用,先序遍歷左子樹  
    PreOrder(root->rchild); //遞歸調用,先序遍歷右子樹  
}  

2、非遞歸操作

思想:二叉樹的非遞歸先序遍歷,先序遍歷思想:先讓根進棧,只要棧不為空,就可以做彈出操作, 每次彈出一個結點,記得把它的左右結點都進棧,記得右子樹先進棧,這樣可以保證右子樹在棧中總處於左子樹的下面。

代碼:

void PreOrder_Nonrecursive(BiTree T)     //先序遍歷的非遞歸    
{  
    if(!T) return ;    
    stack<BiTree> s;  
    s.push(T);  
    while(!s.empty())  
    {  
        BiTree temp = s.top();  
        cout<<temp->data<<" ";  
        s.pop();  
        if(temp->rchild)  
            s.push(temp->rchild);  
        if(temp->lchild)  
            s.push(temp->lchild);  
    }  
}  

或者:

void PreOrder_Nonrecursive(BiTree T)     //先序遍歷的非遞歸  
{  
    if(!T) return ;  
    stack<BiTree> s;  
    while(T)          // 左子樹上的節點全部壓入到棧中  
    {  
        s.push(T);  
        cout<<T->data<<"  ";  
        T = T->lchild;  
    }        
    while(!s.empty())  
    {          
        BiTree temp = s.top()->rchild;  // 棧頂元素的右子樹  
        s.pop();                        // 彈出棧頂元素  
        while(temp)          // 棧頂元素存在右子樹,則對右子樹同樣遍歷到最下方  
        {  
            cout<<temp->data<<"  ";  
            s.push(temp);  
            temp = temp->lchild;  
        }  
    }  
}  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM