以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 算法理论与分析 』  (http://bbs.xml.org.cn/list.asp?boardid=60)
----  层序遍历二叉树[原创]  (http://bbs.xml.org.cn/dispbbs.asp?boardid=60&rootid=&id=26766)


--  作者:binaryluo
--  发布时间:1/24/2006 11:35:00 PM

--  层序遍历二叉树[原创]
要求:设计一个算法层序遍历二叉树(同一层从左到右访问)。

我写了一个算法:用一个队列保存被访问的当前节点的左右孩子以实现层序遍历。

Status HierarchyBiTree(BiTree T, Status (*Visit)(TElemType e)) {
        LinkQueue *Q;     // 保存当前节点的左右孩子的队列
        
        InitQueue(Q);       // 初始化队列

        if (T == NULL) return ERROR; //树为空则返回
        p = T;                  // 临时保存树根T到指针p中
        Visit(p->data);      // 访问根节点
        if (p->lchild) EnQueue(Q, p->lchild);  // 若存在左孩子,左孩子进队列
        if (p->rchild) EnQueue(Q, p->rchild); // 若存在右孩子,右孩子进队列

        while (!QueueEmpty(Q)) {                // 若队列不空,则层序遍历
                DeQueue(Q, p);                       // 出队列
                Visit(p->data);                         // 访问当前节点

                if (p->lchild) EnQueue(Q, p->lchild);  // 若存在左孩子,左孩子进队列
                if (p->rchild) EnQueue(Q, p->rchild); // 若存在右孩子,右孩子进队列
        }

        DestroyQueue(Q);                           // 释放队列空间
        return OK;
}

算法分析:假设T有n个节点。因为本算法中基本操作是Visit(p->data),则时间复杂度为O(n);由于用一个队列保存当前孩子的节点,所以队列占用的额外空间为该二叉树的叶子节点数,最好情况是一棵只有左分支或只有右分支的单边树,此时占用空间最少,仅为1。最坏情况是该树是满二叉树,此时占用的空间最多为(n+1)/2。


--  作者:elfstone
--  发布时间:3/5/2006 2:34:00 PM

--  
我以前写的一个层次遍历森林的算法,在此作为补充
void travel_tree(tree t)    //tree为森林结构
{
    tree tmp=t;
    while(tmp!=NULL)
    {
     visite_tnode(tmp);    //   visite_tnode为访问树结点函数,主要是打标记
     if(tmp->firstson!=NULL)
         seqqueue_enqueue(s,tmp->firstson);    //入队
     while(tmp->nextbrother!=NULL)
     {
         tmp=tmp->nextbrother;       //兄弟节点不为空就访问兄弟节点
         visite_tnode(tmp);
         if(tmp->firstson!=NULL)        //同时保存该节点的第一个子节点
      seqqueue_enqueue(s,tmp->firstson);
     }
     seqqueue_outqueue(s,tmp);     //一层(一枝)结束后,由队列中拿到下一层(一枝)的节点
    }
}


--  作者:detivoli
--  发布时间:3/17/2006 12:21:00 PM

--  
算法设计一直没有很好的学习,以前上DA的时候,老师说层次遍历不是太重要,也没怎么去看,自己也没认真看过.
还好,能够看懂!
--  作者:bigqueues
--  发布时间:4/27/2006 6:11:00 PM

--  
呵呵,顶一个
--  作者:LEAGUE
--  发布时间:8/10/2006 1:58:00 PM

--  
ding~~~~~~~~~~
--  作者:wnn349308824
--  发布时间:9/9/2006 11:49:00 PM

--  
广搜
--  作者:sjx19871109
--  发布时间:4/17/2008 12:08:00 PM

--  顶一个
刚学数据结构,一直不太清楚队列的用途,现在终于看到了,谢谢!
--  作者:netjian
--  发布时间:4/28/2008 10:42:00 PM

--  
对于某些搜索,如赫夫曼树,层序遍历是非常重要的。
--  作者:冬天的农夫
--  发布时间:4/30/2008 3:13:00 PM

--  
你写这个代码要说明什么问题???????//

--  作者:lxztju
--  发布时间:5/1/2008 10:56:00 AM

--  
有参考价值
--  作者:elegant87
--  发布时间:11/6/2008 5:47:00 PM

--  
学习了!谢谢分享!
--  作者:popozhu
--  发布时间:11/13/2008 10:13:00 PM

--  
看看……
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
187.500ms