树的操作

Posted 勇士后卫头盔哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树的操作相关的知识,希望对你有一定的参考价值。

树的属性操作

树的属性操作具体指的就是树中结点的数目,树的高度,树的度数等…
1.树中结点的数目

查找树中结点数目的操作是递归完成的,是递归就有递归出口,当结点为空或者结点的子链表长度为0时就为递归出口,上图就是递归公式的提炼,我们看到下图,要求出该树的结点数可以分为3个部分,count(B)表示求以B为根结点的树的结点数,count©表示求以C为根结点的树的结点数,count(D)表示求以D为根结点的树的结点数,看得count(A)的同时又用到count©这就是一个递归调用的过程

代码演示

int count(GTreeNode<T>* node)const

      int ret = 0;
      if(node!=NULL)
      
         ret = 1;
         for(node->child.move(0);!node->child.end();node->child.next())
         
            ret+=count(node->child.current());
         
      
      return ret;

结果:

13

2.树中的高度

求树中的高度也是递归调用的,树中的高度等于其子树的高度的最大值+1,递归公式如下所示

int height(GTreeNode<T>* node)const

    int ret = 0;
    if(node!=NULL)
    

       for(node->child.move(0);!node->child.end();node->child.next())
       
          int h= height(node->child.current());
          if(ret<h)
          
              ret = h;
          
       
       ret = ret + 1;
    
    return ret;

结果

4

3.树的度数
求树的度数也是递归进行的

树的层次遍历

树是非线性的数据结构,树的结点没有固定的编号方式,为通用树结构提供新的方法,快速遍历每一个结点,设计思路就是引入一个游标,在树中定义一个游标(GTreeNode*),遍历开始前将游标指向根结点(root()),获取游标指向的数据元素,通过结点中的child成员移动游标,具体思路如下图所示,

具体操作:

我们新建一个队列,begin时将根节点A加入队列,然后打印出根节点A的值,接着将将队列的头结点A提出队列并将根节点A的子节点B,C,D加入队列中,此时打印出B节点的值并将B节点提出队列,接着将B节点的字节点E,F加入队列…依次类推就能将树的节点按层次打印出来
begin

bool begin()

      bool ret = (root()!=NULL);//判断根节点是否为空
      if(ret)
      
         m_queue.clear();//清除队列
         m_queue.add(root());//在队列中加入根节点
      
      return ret;
  

next

bool next()

    bool ret = (m_queue.length()>0);//判断队列长度是否大于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;

current

 T current()

    if(!end())
    
        return m_queue.front()->value;//若没有结束则打印节点值
    
    else
    
        THROW_EXCEPTION(InvalidParamterException,"No value at current position....");
    

end

bool end()

    return (m_queue.length()==0);
 

测试代码:

int main()

  GTree<char> t;
  GTreeNode<char> *node = NULL;
  GTreeNode<char> root;
  t.insert('A',NULL);
  node = t.find('A');
  t.insert('B',node);
  t.insert('C',node);
  t.insert('D',node);

  node = t.find('B');
  t.insert('E',node);
  t.insert('F',node);

  node = t.find('E');
  t.insert('K',node);
  t.insert('L',node);

  node = t.find('C');
  t.insert('G',node);

  node = t.find('D');
  t.insert('H',node);
  t.insert('I',node);
  t.insert('J',node);


  node = t.find('H');
  t.insert('M',node);



  //cout<<t.degree()<<endl;


  for(t.begin();!t.end();t.next())
  
      cout<<t.current()<<endl;
  
  return 1;

结果:

以上是关于树的操作的主要内容,如果未能解决你的问题,请参考以下文章

二叉树

数据结构 数

第5章学习小结

第5章学习小结

第5章总结

第5章总结