Chinaunix首页 | 论坛 | 博客
  • 博客访问: 145718
  • 博文数量: 108
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 940
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-15 20:24
个人简介

反反复复

文章分类

全部博文(108)

文章存档

2014年(72)

2013年(36)

我的朋友

分类: C/C++

2013-03-03 11:43:45

栈的作用:用来存放要访问的结点,把所有结点(包含空指针)先入栈,再把满足条件的结点出栈的过程,出栈的顺序就是遍历结点的顺序。栈有先入后出的特性,因此先将该结点入栈,再将该结点的左子树入栈,访问完该结点后,再将右子树入栈。

栈顶结点是需要第一个访问的结点。

访问结点的条件:该结点的左子树是空树。(因此要把该结点入栈,再将其所有左子树结点入栈。)

大体思路:

1、先将根结点入栈,遍历左子树。

2、访问根结点。

3、中序遍历右子树。

int InOrderTraverse(Bitree T, int (*Print)(TElemType e)){

    BiTree p;

    InitStack(S);

    Push(S,T); //将该结点作为第一个要访问的结点入栈

    while(StackEmpty(S){  //循环检查是否存在未访问的结点(包含空指针)。

        while(GetTop(S,p) && p) //若栈中需要第一个访问的结点存在。则把其左孩子入栈,使其左孩子变为第一个要访问的结点,直至左孩子为空指针;若不存在则将该空指针出栈。

        push(S, p->lchild);

        Pop(S,p);  //将栈中的空指针删除。

        if(!StackEmpty(S)){ //把栈中的空指针出栈后,再一次检查是否含有未访问的结点(栈中不包含空指针)。

            Pop(S,p);

            if(!Print(p->data)) return 0;    //访问结点。

            Push(p->rchild);//把右子树作为第一个要访问的结点入栈(即开始中序遍历右子树)。

        }//if

    }//while

}//InOrderPraverse



            

    

    

        

阅读(415) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~