MyException - 我的异常网
当前位置:我的异常网» 数据结构与算法 » 求解释,中序遍历二叉树的非递归算法解决方案

求解释,中序遍历二叉树的非递归算法解决方案

www.MyException.Cn  网友分享于:2013-11-01  浏览:4次
求解释,中序遍历二叉树的非递归算法
中序遍历二叉树的非递归算法
 void InOrderTraverse(BiTree bt){
 //二叉树bt采用二叉链表存储,对bt进行中序遍历
   if(bt){
    InitStack(S); Push(S, bt); //根指针进栈
    while(!StackEmpty(S)) {
    while(GetTop(S,p)&&p) 
    Push(S, p->lchild); //向左一直走到尽头
    Pop(S, p); //空指针退栈
    if(! StackEmpty(S))
    { Pop(S,p); printf(p->data); Push(S, p->rchild); }
    } //while
   } //if
 } // InOrderTraverse

最后面Push(S, p->rchild);这一句,前面已经到了最左下角的了(假设存在这个左孩子),printf这个data之后,将rchild入栈,因为没有右孩子,入进去的是NULL,Pop出来,P就是NULL,NULL打印,再入栈右孩子。我蒙圈了,求解释这个if循环。谢谢了,老师讲的给忘了,晚上自习看不明白了。



------解决方案--------------------
中序遍历思路应该是很明晰的啊:对于结点P,一直往左走,并把经过的结点都压栈里面,直到最左边。想想,此时这个结点是不是应该第一个访问(因为它没有左子树了)。访问这个结点,然后,判断它的右子树,如果不为空,则用同样的方式处理它的右子树。如果为空,那就从栈里面弹出来一个结点得了,栈为空就结束了。
至于代码实现,可以有两种方式:(这是我以前写的两种实现方式)
C/C++ code
//中序遍历(非递归)
template<class T>
void mediumOrderVisitNoRecursion(Node<T>* root)
{
    //遇到一非空结点,则把其压入栈中,之后遍历其左子树
    //结点为空,则从栈中弹出一结点,并访问
    //遍历该结点的右子树
    stack<Node<T>*>sta;
    Node<T>* point=root;
    
    //空树则返回
    if(root==NULL){return;}

    while(!sta.empty() || point!=NULL)
    {
        if(point!=NULL)
        {
            sta.push(point);
            point=point->getLeft();        
        }
        else
        {
            point=sta.top();
            visit(point);
            sta.pop();
            point=point->getRight();
        }
    }
}

//中序遍历(非递归)(另一种写法)
template<class T>
void mediumOrderVisitNoRecursion_1(Node<T>* root)
{
    //遇到一非空结点,则把其压入栈中,往左继续走,直至为空(走到最左侧结点)
    //从栈中弹出(若栈不空)一个结点访问
    //遍历该结点的右子树
    stack<Node<T>*>sta;
    Node<T>* point=root;

    //空树则返回
    if(root==NULL){return;}

    while(!sta.empty() || point)
    {
        while(point)    //一直往右遍历,直到最左边的结点
        {
            sta.push(point);
            point=point->getLeft();        
        }
        point=NULL;
        if(!sta.empty())        //栈不为空,取出栈顶值,访问。其实就是访问的最左边的结点
        {
            point=sta.top();
            visit(point);
            sta.pop();
        }
        point=point->getRight();
    }

    while(!sta.empty() || point!=NULL)
    {
        if(point!=NULL)
        {
            sta.push(point);
            point=point->getLeft();        
        }
        else
        {
            point=sta.top();
            visit(point);
            sta.pop();
            point=point->getRight();
        }
    }
}

文章评论

10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
漫画:程序员的工作
漫画:程序员的工作
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
编程语言是女人
编程语言是女人
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
程序员和编码员之间的区别
程序员和编码员之间的区别
为什么程序员都是夜猫子
为什么程序员都是夜猫子
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
Java程序员必看电影
Java程序员必看电影
我是如何打败拖延症的
我是如何打败拖延症的
10个调试和排错的小建议
10个调试和排错的小建议
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
程序员必看的十大电影
程序员必看的十大电影
每天工作4小时的程序员
每天工作4小时的程序员
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
一个程序员的时间管理
一个程序员的时间管理
如何成为一名黑客
如何成为一名黑客
程序员应该关注的一些事儿
程序员应该关注的一些事儿
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
程序员都该阅读的书
程序员都该阅读的书
总结2014中国互联网十大段子
总结2014中国互联网十大段子
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
代码女神横空出世
代码女神横空出世
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
程序员的鄙视链
程序员的鄙视链
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
旅行,写作,编程
旅行,写作,编程
我的丈夫是个程序员
我的丈夫是个程序员
老程序员的下场
老程序员的下场
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
中美印日四国程序员比较
中美印日四国程序员比较
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有