中序遍歷(非遞迴)
阿新 • • 發佈:2019-02-03
//前序遍歷 /*前序遍歷的遞迴實現*/ void preOrder(BinTree *root){ if(NULL!=root){ cout<<root->data<<" "; preOrder(root->lchild); preOrder(root->rchild); } } /*非遞迴實現*/ /*根據前序遍歷訪問的順序,優先訪問根節點,然後再分別訪問左孩子和右孩子。 即對於任一節點,其可看做是根節點,因此可以直接訪問,訪問完之後,若其左孩子 不為空,按相同規則訪問它的左子樹,當訪問其左子樹時,在訪問它的右子樹 */ //對於任意節點P:(1)訪問節點P,並將節點P入棧 //(2)判斷節點P的左孩子是否為空,若為空,則取棧頂節點並進行出棧操作,並將棧頂節點的右孩子置為當前的節點P,迴圈至1;若不為空,則將P的左孩子置為當前的節點P //(3)直到P為NULL並且棧為空,則遍歷結束 void preOrder(BinTree *root){ stack<BinTree *>s; BinTree *p=root; while(p!=NULL||!s.empty()){ while(p!=NULL){ cout<<p->data<<" "; s.push(p); p=p->lchild; } if(!s.empty()){ p=s.top(); s.pop(); p=p->rchild; } } } /*中序遍歷*/ //中序遍歷 “左孩子--根節點--右孩子” //遞迴實現 void inOrder(BinTree *root){ if(root!=NULL){ inOrder(root->lchild); cout<<root->dada<<" "; inOrder(order->rchild); } } //非遞迴實現 //根據中序遍歷的順序,對於任意節點,優先訪問其左孩子,而左孩子節點又可以看做一根節點,然後繼續訪問左孩子節點為空的節點才進行 //訪問,然後按相同的規則訪問其右子樹。因此其處理過程如下: //(1)對於任意節點其左孩子不為空,則將P入棧並將P的左孩子置為當前的P,然後對當前節點P再進行相同的處理 //(2)若其左孩子不為空,則取棧頂元素並進行出棧操作,訪問該棧頂節點,然後將當前的P置為棧頂節點的右孩子 //(3)直到P為NULL並且棧為空則遍歷結束 void inOrder(BinTree *root){ stack<BinTree*>s; BinTree *p=root; while(p!=NULL||!s.empty()){ while(p!=NULL){ s.push(p); p=p->lchild; } if(!s.empty()){ p=s.top(); cout<<p->data<<" "; s.pop(); p=p->rchild; } } }