美文网首页
58_树形结构的层次遍历

58_树形结构的层次遍历

作者: 编程半岛 | 来源:发表于2018-07-26 15:11 被阅读90次

关键词:层次遍历

0. 问题:如何按层次遍历通用树结构中的每一个数据元素?

  • 当前的事实:树是非线性的数据结构,树的结点没有固定的编号方式
  • 新的需求:为通用树结构提供新的方法,快速遍历每一个结点

1. 设计思路(游标)

  • 在树中定义一个游标GTreeNode<T>*
  • 遍历开始前将游标指向根结点root()
  • 获取游标指向的数据元素
  • 通过结点中的child成员移动游标

提供一组遍历相关的函数,按层次访问树中的数据元素

函数 功能说明
begin() 初始化,准备进行遍历访问
next() 游标移动,指向下一个结点
current() 获取游标所指向的数据元素
end() 判断游标是否到达尾部

2. 层次遍历算法

  • 原料:class LinkQueue<T>;
  • 游标:LinkQueue<T>::front()
  • 思想:
    • begin():将根节点压入队列中
    • current():访问队头元素指向的数据元素
    • next()队头元素弹出,将队头元素的孩子压入队列中
    • end():判断队列是否为空
      层次遍历算法示例
    bool begin()
    {
        bool ret = ( root() != NULL );      // 判断根结点不为空

        if( ret )
        {
            m_queue.clear();        // 先清空队列

            m_queue.add(root());    // 将根结点添加到队列中
        }

        return ret;
    }

    bool end()
    {
        return (m_queue.length() == 0);
    }

    bool next()
    {
        bool ret = (m_queue.length() > 0);

        if( ret )
        {
            GTreeNode<T>* node = m_queue.front();   // 取出对头元素

            m_queue.remove();

            for(node->child.move(0); !node->child.end(); node->child.next())    // 将对头元素的子结点压入队列中
            {
                m_queue.add(node->child.current());
            }
        }

        return ret;
    }

    T current()
    {
        if( !end() )
        {
            return m_queue.front()->value;
        }
        else
        {
            THROW_EXCEPTION(InvalidOperationExcetion, "No value at current position...");
        }

    }

3. 小结

  • 树中的结点没有固定的编号方式
  • 可以按照层次关系对树中的结点进行遍历
  • 通过游标的思想设计遍历成员函数
  • 遍历成员函数是相互依赖,相互配合的关系
  • 遍历算法的核心为队列的使用

声明:此文章仅是本人在学习狄泰学院《数据结构实战开发教程》所做的笔记,文章中包含狄泰软件资料内容,一切版权归狄泰软件所有!
实验环境:ubuntu10 + Qt Creator2.4.1 + Qt SDK 4.7.4

相关文章

  • 58_树形结构的层次遍历

    关键词:层次遍历 0. 问题:如何按层次遍历通用树结构中的每一个数据元素? 当前的事实:树是非线性的数据结构,树的...

  • 递归遍历树形结构

    原有的结构 (树形结构) 实现后的结构 完整代码 可复制代码 Document...

  • 树形组件拖拽写法思路

    树形结构的生成,可以通过递归树形数据遍历而成 节点的思路 children-container 需要加个paddi...

  • 10.组合模式(结构型)

    组合模式(结构型) 一、概述 对于树形结构,当容器对象(如文件夹)的某一个方法被调用时,将遍历整个树形结构,寻找也...

  • JS树结构数据的遍历

    title: JS树结构数据的遍历date: 2022-04-14description: 针对项目中出现树形结构...

  • 设计模式:组合模式 职责链模式

    组合模式 职责链模式 组合模式 组合模式将对象组合成树形结构,以表示“部分-整体”的层次结构。 在组合模式的树形结...

  • 8.设计模式(组合模式)

    1.组合模式:将对象组合成树形结构,以表示“部分-整体“的层次结构。除了用来表示树形结构之外,组合模式的另一个好处...

  • JavaScript组合模式

    组合模式将对象组合成树形结构,以表示“部分-整体”的层次结构。除了用来表示树形结构之外,组合模式的另一个好处是通过...

  • 2018-03-26

    组合模式_a概述 对于树形结构,当容器对象(如文件夹)的某一个方法被调用时,将遍历整个树形结构,寻找也包含这个方...

  • Java 遍历之树形菜单

    如图,实现这样一个树形结构的菜单,java怎么实现?这里就需要用到遍历。 新建一个实体类 树形结构 思路:首先找根...

网友评论

      本文标题:58_树形结构的层次遍历

      本文链接:https://www.haomeiwen.com/subject/ppavmftx.html