二叉树遍历(非递归)
//中序遍历,非递归
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;
}
}
}
躲猫猫社团团长 http://t.sina.com.cn/coolria
浙公网安备 33010602011771号