首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

二叉树中序遍历的非递归算法转变成源代码

2012-02-21 
二叉树中序遍历的非递归算法转变成源代码,高手请进算法我看得懂,现成的源代码,我也看得懂。可是这个算法如

二叉树中序遍历的非递归算法转变成源代码,高手请进
算法我看得懂,现成的源代码,我也看得懂。
可是这个算法如果让我自己转变成代码,不会写,这个过程是怎样的呢。。。

[解决办法]
呵呵 这个是数据结构中 相当 Trick 的一道题。

其实就是 在压栈呢时候 多压一个空指针就可以了
根据空指针来判断 指第一次造访还是 第二次 造访
[解决办法]
void Middle(Bitlist *T)
{
if(T==NULL)
{
printf("The Bitree is NULL\n");
return;
}
Sqstack stack=CreateStack();//建立一个栈
while(!EmptyOfStack(stack)||T!=NULL)//当栈不为空或者结点不为叶子时,即此树还未中序遍历完
{
if(T!=NULL)
{
stack=Push(stack,T);//将结点压入栈,此时压入栈的均为子树的左子树方向(包括各子树的头结点,可以这样理解被压入的子树头结点其实是右子树方向)
T=T->lchild;
}
else
{
T=GetTop(stack);//若结点为空结点,则取出栈顶元素,容易理解,此时取出的结点的左子树为空,则开始访问该头结点(以输出操作代表访问)
printf("%c ",T->data);
stack=Pop(stack);//由于该结点元素已经访问完毕,故需要从栈中退出
T=T->rchild;//接下来遍历该头结点的右子树
}
}
}
中序非递归算法就是将未访问的元素压入栈,一旦遍历的左子树为空,则访问该子树头结点,在遍历右子树。栈的作用是将为访问的结点存入,向根结点左子树方向深入,然后通过不断的出栈操作,层层退出,然后在遍历根结点,右子树,思维方法还是和遍历左子树时是一样的。

其实非递归和递归算法关键是怎么理解递归的深入和入栈出栈的关系,理解的这一点递归转化为非递归还是比较简单的。

按的解释可能不是很清晰,若有不妥还请勿怪

热点排行