1. 程式人生 > >中序遍歷(非遞迴)

中序遍歷(非遞迴)

//前序遍歷
/*前序遍歷的遞迴實現*/
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;
		}
	}
}