天天看點

二叉樹的非遞歸周遊——前序

**

二叉樹的非遞歸周遊——前序

**

1.核心思想

①非遞歸,即必須要利用棧來實作;
②前序周遊的順序為,先輸出目前節點資料域的值,再輸出其左子樹上的值,其次為右子樹;
③利用棧的先進後出,先将右子樹存入,再将左子樹存入,出棧時自然先左後右,将這個過程寫入循環,即可實作非遞歸周遊;
           

2.代碼

①結構體類型

typedef struct Node{
    int data;
    struct Node *left;
    struct Node *right;
}BTNode; 
           

②核心代碼

void Forder(BTNode *root){//傳入一顆二叉樹
BTNode **S=(BTNode**)malloc(N*sizeof(BTNode*));//申請一段空間來存放節點,N為總節點個數(雖然用不完)
int top=-;//棧頂指針初始化
BTNode *p;//接受出棧的節點
S[++top]=root;//先将根節點入棧
while(top!=-){//當棧頂指針為-1時停止,這裡也可用do while結構,個人喜好
p=S[top--];//前序周遊,先出棧
cout<<p->data<<"\t";
if(p->right) S[++top]=p->right;//先進後出,故先存右子女
if(p->left) S[++top]=p->left;
}
free(S);//最後将所申請的空間釋放掉
} 
           

③主函數

int main(void){
        int Data[]={,,,,,,,};
        BTNode *root=CreateTree(Data,);//參考二叉搜素數的建立
        Forder(root);

}
           

3輸出效果

二叉樹的非遞歸周遊——前序

有疑問歡迎留言讨論………..

繼續閱讀