Chinaunix首页 | 论坛 | 博客
  • 博客访问: 538124
  • 博文数量: 119
  • 博客积分: 3391
  • 博客等级: 中校
  • 技术积分: 981
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-12 11:49
文章分类

全部博文(119)

文章存档

2014年(3)

2013年(1)

2011年(18)

2010年(27)

2009年(70)

我的朋友

分类: C/C++

2010-10-25 11:44:35

先序遍历
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));
}     
阅读(1041) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-10-25 16:20:30

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com