文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>二叉树的非递归遍历

二叉树的非递归遍历

时间: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));
}     
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载