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

二叉树中的中序遍历有关问题

2013-04-02 
二叉树中的中序遍历问题大家好,让给位大神详细解释一下计算机内部是如何处理二叉树中序遍历递归循环的,这

二叉树中的中序遍历问题
大家好,让给位大神详细解释一下计算机内部是如何处理二叉树中序遍历递归循环的,这个递归算法太精简了,看不懂计算机是怎么运行它的,下面是该算法代码!
Status InOrderTraverse(BiTree T)//
{
if(T)
{
if(InOrderTraverse(T->lchild))
if(Visit(T->data))
if(InOrderTraverse(T->rchild))
return OK;
return ERROR;
}
else
return OK;
}
[解决办法]
递归的过程就是程序把函数进行压栈和弹栈的过程。

一、首先,你要记住:二叉树是一个递归结构,课本上的算法的意思是:假设T是节点指针,先中序遍历节点的左子树,然后visit这个节点,最后遍历节点的右子树。
二、如果不能理解递归算法,可以试试写出非递归的中序遍历算法;
由于课本上的“节点的结构体”没有指向“父节点”的指针,所以我们需要借助一个栈来描述非递归算法:
1、先让指针T指向根节点;
2、判断T是否有左子树,如果有,则压栈,并让T指向T的左子树,重复这个步骤;
3、一直循环,找到第一个“没有左子树”的节点,即为“最左下角的节点”;如果T有右子树,直接执行步骤4,如果T没有右子树,先visit(T),然后执行步骤4;
4、弹栈:当栈为空时,程序结束;当栈不为空时,如果弹出的节点没有右子树,visit(T),继续弹栈;当弹出的节点有右子树,先visit(T),然后把T设置为T的右节点,重复执行第2步。
                                         1
                                    /         \
                                   2           3
                                 /   \       /   \
                                4     5     6     7
                                \    / \   
                                10  8   9
试试这个二叉树,自己画一下遍历过程中每一个步骤的栈的状态,以及visit哪个节点,你就能理解程序是怎么进行压栈和弹栈的了。

热点排行