开发者社区> 问答> 正文

求二叉树的前序遍历和后序遍历的算法(非递归)

用c语言写

展开
收起
知与谁同 2018-07-21 10:19:05 1892 0
1 条回答
写回答
取消 提交回答
  • 阿里云开发者社区运营负责人。原云栖社区负责人。

    百度一下就可以知道答案了。直接搜”二叉树的前序遍历和后序遍历的算法“

    第一条就是:

    http://blog.csdn.net/sky04/article/details/4510266

    我只解释一下先序遍历非递归算法,其他的自学一下吧。:

    //先序遍历非递归算法 void PreOrderUnrec(Bitree *t)
    {
        Stack s;      
        StackInit(s);    //初始化
        Bitree *p=t;     // 二叉树根节点
        
        while (p!=NULL || !StackEmpty(s))
        {
            while (p!=NULL)             //遍历左子树
            {
                visite(p->data);
                push(s,p);
                p=p->lchild;      //lchild 左子树
            }
            
            if (!StackEmpty(s))         //通过下一次循环中的内嵌while实现右子树遍历
            {
                p=pop(s);
                p=p->rchild;     //rchild 右子树   
            }//endif
            
        }//endwhile 
    }

    /*  Stack s ;创建堆栈。这也是堆栈的一个应用。既然你已经学到了二叉树,就应该知道堆栈,可以把以前编写的堆栈程序拿来用。
    POP,PUSH 堆栈的弹出,压栈。
    按照该程序步骤,来演示 s 和指针 p 的内容:(完全二叉树为例)
    前序遍历次序为:ABCDEFG
    1.第一次执行 while语句后 
    栈 s[底部,ABC]   p=NULL  访问了 :ABC节点
    2.第一次执行 if
    栈 s[底部,AB]   p=NULL  访问了 :ABC节点 由于c的右子树为空,所以p=NULL
    3.第二次跳过了 while
    4.第二次执行 if
    栈 s[底部,A]   p指向了D  访问了:ABC节点
    5.第三次执行 while语句后 
    栈 s[底部,AD]   p=NULL   访问了:ABCD节点,本次while循环,只访问了D



     剩下步骤的自己来吧!
     实际上,递归也是在操作堆栈。
     一般的书上应该有这么类似的话:
     “利用一个辅助堆栈,可以将递归算法转化为等价的分递归算法”
     
    */

    2019-07-17 22:55:42
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
数据+算法定义新世界 立即下载
袋鼠云基于实时计算的反黄牛算法 立即下载
Alink:基于Apache Flink的算法平台 立即下载