中序遍历(非递归)

//前序遍历
/*前序遍历的递归实现*/
void preOrder(BinTree *root){
	if(NULL!=root){
		cout<data<<" ";
		preOrder(root->lchild);
		preOrder(root->rchild);
	}
}
/*非递归实现*/
/*根据前序遍历访问的顺序,优先访问根节点,然后再分别访问左孩子和右孩子。
即对于任一节点,其可看做是根节点,因此可以直接访问,访问完之后,若其左孩子
不为空,按相同规则访问它的左子树,当访问其左子树时,在访问它的右子树
*/
//对于任意节点P:(1)访问节点P,并将节点P入栈
//(2)判断节点P的左孩子是否为空,若为空,则取栈顶节点并进行出栈操作,并将栈顶节点的右孩子置为当前的节点P,循环至1;若不为空,则将P的左孩子置为当前的节点P
//(3)直到P为NULL并且栈为空,则遍历结束
void preOrder(BinTree *root){
	stacks;
	BinTree *p=root;
	while(p!=NULL||!s.empty()){
		while(p!=NULL){
			cout<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<dada<<" ";
		inOrder(order->rchild);
	}
}
//非递归实现
//根据中序遍历的顺序,对于任意节点,优先访问其左孩子,而左孩子节点又可以看做一根节点,然后继续访问左孩子节点为空的节点才进行
//访问,然后按相同的规则访问其右子树。因此其处理过程如下:
//(1)对于任意节点其左孩子不为空,则将P入栈并将P的左孩子置为当前的P,然后对当前节点P再进行相同的处理
//(2)若其左孩子不为空,则取栈顶元素并进行出栈操作,访问该栈顶节点,然后将当前的P置为栈顶节点的右孩子
//(3)直到P为NULL并且栈为空则遍历结束
void inOrder(BinTree *root){
	stacks;
	BinTree *p=root;
	while(p!=NULL||!s.empty()){
		while(p!=NULL){
			s.push(p);
			p=p->lchild;
		}
		if(!s.empty()){
			p=s.top();
			cout<data<<" ";
			s.pop();
			p=p->rchild;
		}
	}
}

你可能感兴趣的:(Algorithm)