二叉树遍历(非递归)

//中序遍历,非递归
void inTravel(NodePtr root){
	if(root==NULL)
	return ;

stack<NodePtr> st;
NodePtr left = root;
NodePtr lastVisit;
while(st.size()>0||left){
	
	
	
	//左子树非空则走到底
	while(left){
		st.push(left);
		left=left->pLeft;
	}
	
	if(!st.empty()){
		
		NodePtr top = st.top();
		visitNode(0,top);
		st.pop();
		if(top->pRight){
			
			left=top->pRight;
		}
	}
}
	
	
	if(root==NULL)
		return ;
}

//前序遍历,非递归,根入栈,右节点先入栈
void preTravel(NodePtr root){


	if(root==NULL)
		return ;

	stack<NodePtr> st;

	st.push(root);
	while(st.size()>0){

		NodePtr top = st.top();
		st.pop();
		visitNode(0,top);
		if(top->pRight){
			st.push(top->pRight);
		}
		if(top->pLeft){
			st.push(top->pLeft);
		}

	}
	

}

//非递归算法实现后序遍历
void postTravel(NodePtr root){

	if(root==NULL)
		return ;

	stack<NodePtr> st;
	NodePtr left = root;
	NodePtr lastVisit;
	while(st.size()>0||left){


		
		//左子树非空则走到底
		while(left){
			st.push(left);
			left=left->pLeft;
		}

		left = st.top();
	
		//如果没有右节点则访问,或者有右节点,但它已被访问过了
		if(left->pRight==NULL||lastVisit==left->pRight){
		
				visitNode(0,left);
				lastVisit = left;
				left = NULL;
				st.pop();
			
		}else{
		//有右节点,则右子树开始
			left = left->pRight;


		}

	}

}
posted on 2011-10-09 16:44  yangyh  阅读(252)  评论(0)    收藏  举报