zoukankan      html  css  js  c++  java
  • 树——二叉树的层次遍历

    1,二叉树的遍历:

           1,二叉树的遍历(Traversing Binary Tree)是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次,且仅被访问一次;

                  1,层次就是访问的次序,层次遍历是先访问第一层、再第二层等;

    2,考虑的问题:

           1,通用树结构的层次遍历算法是否可以用在二叉树结构上?如果可以,代码需要做怎样的改动?

                  1,可以的,二叉树是一种特别的树;

                  2,通用树使用的算法可以移植到二叉树使用的场合;

                 

    3,设计思路(游标):

     

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

        

    4,层次遍历算法:

           1,原料:class LinkQueue<T>;

           2,游标:LinkQueue<T>::front();

           3,思想:

                  1,begin() ==> 将根结点压入队列中;

                  2,current() ==> 访问队头元素指向的数据元素;

                  3,next() ==> 队头元素弹出,将队头元素的孩子压入队列中(核心);

                  4,end() ==> 判断队列是否为空; 

             

    5,层次遍历算法示例:

     

    6,二叉树的层次遍历实现:

     1    bool begin()  // 为树中结点的遍历做初始化
     2     {
     3         bool ret = (root() != NULL);  // 不能遍历空树
     4 
     5         if( ret )
     6         {
     7             m_queue.clear();  // 防止上一次没有调用完,这一次又调用,先清除
     8             m_queue.add(root());  // 添加根结点
     9         }
    10 
    11         return ret;
    12    }
    13 
    14     bool end()  // 队列长度为 0 则树遍历结束
    15     {
    16         return (m_queue.length() == 0);
    17    }
    18 
    19     bool next()  // 队头元素弹出来,队头元素的孩子压入队列,同时指针一直指向下一个结点
    20     {
    21         bool ret = (m_queue.length() > 0);  // 有元素才能移动游标
    22 
    23         if( ret )
    24         {
    25             BTreeNode<T>* node = m_queue.front();  // 将 node 指向对头元素
    26 
    27             m_queue.remove();  // 队头元素拿出来,就指向了下一个结点
    28 
    29             if( node->left != NULL )  // 压入左孩子
    30             {
    31                 m_queue.add(node->left);
    32             }
    33 
    34             if( node->right != NULL )  // 压入右孩子
    35             {
    36                 m_queue.add(node->right);
    37             }
    38         }
    39 
    40         return ret;
    41    }
    42 
    43     T current()  // 返回当前游标所指向的结点的元素
    44     {
    45         if( !end() )  // 遍历结束,不指向目标
    46         {
    47             return m_queue.front()->value;  // 将游标指向结点元素返回, front() 函数已经指向了当前的对象
    48         }
    49         else
    50         {
    51             THROW_EXCEPTION(InvalidOperationException, "No value at current position ..."); // 还没开始或者结束的非法操作
    52         }
    53    }
  • 相关阅读:
    [Win32]一个调试器的实现(十)显示变量
    [Win32]一个调试器的实现(九)符号模型
    [Win32]一个调试器的实现(八)单步执行
    [Win32]一个调试器的实现(七)断点
    [Win32]一个调试器的实现(六)显示源代码
    [Win32]一个调试器的实现(五)调试符号
    [Win32]一个调试器的实现(四)读取寄存器和内存
    将博客搬至CSDN
    AndroidManifest.xml解析和五大布局介绍
    十六进制颜色
  • 原文地址:https://www.cnblogs.com/dishengAndziyu/p/10925990.html
Copyright © 2011-2022 走看看