二叉树的非递归遍历
时间:2010-10-25 来源:typhoon85
先序遍历
void preorder(btree *bt)
{
btree *p, *stack[MAX];//p表示当前结点,栈stack[]用来存储结点
int top=0;
if(bt != NULL)//先判断是否为空树
{
stack[top] = bt; //根结点入栈
while(top >= 0)
{
p = stack[top--]; //栈顶元素出栈
printf("%d", p->data);//输出该结点
if(p->rchild != NULL) stack[++top] = p->rchild;//如果该结点有右孩子,将右孩子入栈
if(p->lchild != NULL) stack[++top] = p->lchild;//如果该结点有左孩子,将左孩子入栈,按照后入先出原则,左孩子先出栈
}
}
}
中序遍历
void inorder(btree *bt)
{
btree *p=bt, *stack[MAX]; //p表示当前结点,栈stack[]用来存储结点
int top=0;
if(p != NULL) //先判断是否为空树
{
while(top >= 0)
{
if(p != NULL) //先处理结点的左孩子结点
{
stack[top++] = p; //当前结点入栈
p = p->lchild; //寻找左孩子结点
}
else //找到最左边的孩子结点后
{
if(top == 0) //表示全部元素均已输出,结束输出
break;
p = stack[--top];//栈顶元素出栈
printf("%d", p->data); //输出该结点
p = p->rchild; //处理其右孩子结点
}
}
}
}
或者:
void inorder(btree *bt)
{
btree *p=bt, *stack[MAX];//p表示当前结点,栈stack[]用来存储结点
int top=-1;
do
{
while(p != NULL)//先处理结点的左孩子结点,把所有左孩子依次入栈
{
stack[++top] = p;
p = p->lchild;
}
if(top >= 0) //所有左孩子处理完毕后
{
p = stack[top--];//栈顶元素出栈
printf("%d", p->data); //输出该结点
p = p->rchild; //处理其右孩子结点
}
} while((p != NULL)||(top >= 0));
}
后序遍历
void postorder(btree *bt)
{
btree *p=bt, *stack[MAX];//p表示当前结点,栈stack[]用来存储结点
int tag[MAX];
int top=-1;
do
{
while(p != NULL)//先处理结点的左孩子结点,把所有左孩子依次入栈
{
stack[++top] = p;
tag[top] = 0;
p = p->lchild;
}
if(top >= 0) //所有左孩子处理完毕后
{
if(!tag[top]) //如果当前结点的右孩子还没被访问
{
p = stack[top];//输出栈顶结点 ,但不退栈 ,因为要先输出其孩子结点
p = p->rchild; //处理其右孩子结点
tag[top] = 1; //表示栈中top位置存储的结点的右孩子被访问过了,下次轮到它退栈时可直接输出
}
else //如果该结点的左右孩子都被访问过了
{
printf("%d", stack[top--]->data); //栈顶元素出栈,输出该结点,此时结点p指向NULL
}
}
} while((p != NULL)||(top >= 0));
}
void preorder(btree *bt)
{
btree *p, *stack[MAX];//p表示当前结点,栈stack[]用来存储结点
int top=0;
if(bt != NULL)//先判断是否为空树
{
stack[top] = bt; //根结点入栈
while(top >= 0)
{
p = stack[top--]; //栈顶元素出栈
printf("%d", p->data);//输出该结点
if(p->rchild != NULL) stack[++top] = p->rchild;//如果该结点有右孩子,将右孩子入栈
if(p->lchild != NULL) stack[++top] = p->lchild;//如果该结点有左孩子,将左孩子入栈,按照后入先出原则,左孩子先出栈
}
}
}
中序遍历
void inorder(btree *bt)
{
btree *p=bt, *stack[MAX]; //p表示当前结点,栈stack[]用来存储结点
int top=0;
if(p != NULL) //先判断是否为空树
{
while(top >= 0)
{
if(p != NULL) //先处理结点的左孩子结点
{
stack[top++] = p; //当前结点入栈
p = p->lchild; //寻找左孩子结点
}
else //找到最左边的孩子结点后
{
if(top == 0) //表示全部元素均已输出,结束输出
break;
p = stack[--top];//栈顶元素出栈
printf("%d", p->data); //输出该结点
p = p->rchild; //处理其右孩子结点
}
}
}
}
或者:
void inorder(btree *bt)
{
btree *p=bt, *stack[MAX];//p表示当前结点,栈stack[]用来存储结点
int top=-1;
do
{
while(p != NULL)//先处理结点的左孩子结点,把所有左孩子依次入栈
{
stack[++top] = p;
p = p->lchild;
}
if(top >= 0) //所有左孩子处理完毕后
{
p = stack[top--];//栈顶元素出栈
printf("%d", p->data); //输出该结点
p = p->rchild; //处理其右孩子结点
}
} while((p != NULL)||(top >= 0));
}
后序遍历
void postorder(btree *bt)
{
btree *p=bt, *stack[MAX];//p表示当前结点,栈stack[]用来存储结点
int tag[MAX];
int top=-1;
do
{
while(p != NULL)//先处理结点的左孩子结点,把所有左孩子依次入栈
{
stack[++top] = p;
tag[top] = 0;
p = p->lchild;
}
if(top >= 0) //所有左孩子处理完毕后
{
if(!tag[top]) //如果当前结点的右孩子还没被访问
{
p = stack[top];//输出栈顶结点 ,但不退栈 ,因为要先输出其孩子结点
p = p->rchild; //处理其右孩子结点
tag[top] = 1; //表示栈中top位置存储的结点的右孩子被访问过了,下次轮到它退栈时可直接输出
}
else //如果该结点的左右孩子都被访问过了
{
printf("%d", stack[top--]->data); //栈顶元素出栈,输出该结点,此时结点p指向NULL
}
}
} while((p != NULL)||(top >= 0));
}
相关阅读 更多 +