void PreSort(BiTree* root){
std::stack<BiTree*> s_Tree;
while( !s_Tree.empty() || root != NULL){
//前序遍历是访问一个根节点打印一次,所以用if
if(root != NULL){
printf("%d\t", root->data);
s_Tree.push(root);
root = root->left;
}
//当无左节点访问的时候从栈中top一个节点出来,访问其右子树
else{
root = s_Tree.top();
s_Tree.pop();
root = root->right;
}
}//while
}
void MidSort(BiTree* root){
std::stack<BiTree*> s_Tree;
while( !s_Tree.empty() || root!=NULL ){
//中序遍历是将左子树一直入栈
while( root != NULL){
s_Tree.push(root);
root = root->left;
}
//其入栈的过程跟前序一样,只是打印的顺序不一样
if(!s_Tree.empty()){
root = s_Tree.top();
s_Tree.pop();
printf("%d\t", root->data);
root = root->right;
}
}
}
// 通过模拟的方法实现
void PosSort(BiTree* root){
std::stack<BiTree*> s_Tree;
if(root != NULL)
s_Tree.push(root);
while(!s_Tree.empty()){
root = s_Tree.top();
//只有当左右节点都入栈之后才打印这个节点
if(root->visited){
printf("%d\t", root->data);
s_Tree.pop();
}
//否则将其左子树和右子树入栈,先入右,再入左
else{
if(root->right != NULL){
root->right->visited = false;
s_Tree.push(root->right);
}
if(root->left != NULL){
root->left->visited = false;
s_Tree.push(root->left);
}
}
//当左子树和右子树都入栈之后,将根节点的访问标志设为true;
root->visited = true;
}
}
二叉树的前序、中序、后序非递归算法
最新推荐文章于 2022-06-28 17:39:09 发布