Chinaunix首页 | 论坛 | 博客
  • 博客访问: 176950
  • 博文数量: 43
  • 博客积分: 611
  • 博客等级: 中士
  • 技术积分: 1053
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-02 13:37
文章存档

2015年(3)

2013年(23)

2012年(17)

我的朋友

分类: C/C++

2013-04-04 09:04:44

      这里看到了这个题。层次遍历是用队列,一级一级地入队列然后输出。而用递归的话,我首先想到是用两个栈来模拟队列,在递归遍历二叉树的过程中入栈,然后最后一次性出栈。但仔细思考后发现无法做到层次遍历。在这里看到了正确的方法。

     主要代码如下:


  1. void PrintNodeAtLevel(BiTree T,int level)
  2.  {
  3.      // 空树或层级不合理
  4.      if (NULL == T || level < 1 )
  5.          return;
  6.  
  7.      if (1 == level)
  8.      {
  9.          cout << T->data << " ";
  10.          return;
  11.      }
  12.  
  13.      // 左子树的 level - 1 级
  14.      PrintNodeAtLevel(T->leftChild, level - 1);
  15.  
  16.      // 右子树的 level - 1 级
  17.      PrintNodeAtLevel(T->rightChild, level - 1);
  18.  }
  19.  
  20.  
  21.  void LevelTraverse(BiTree T)
  22.  {
  23.      if (NULL == T)
  24.          return;
  25.  
  26.      int depth = Depth(T);
  27.  
  28.      int i;
  29.      for (i = 1; i <= depth; i++)
  30.      {
  31.          PrintNodeAtLevel(T, i);
  32.          cout << endl;
  33.      }
  34.  }

      这个算法先求出根结点的高度,depth=高度+1。在函数PrintNodeAtLevel中,当且仅当level==1时才进行打印。举个例子:

         1 

    2        3

4     5    6   7

     这棵树的根的高度是2,depth=3。然后,在LevelTraverse函数中,level从1开始,这会打印出1;之后level=2,进入PrintNodeAtLevel(T->leftChild,  level - 1)函数和PrintNodeAtLevel(T->rightChild, level - 1),level又等于1,就打印出2,3。以此类推,整棵树就按层打印出来了。

     参考资料(即此递归算法的来源):http://blog.csdn.net/stpeace/article/details/8138458

      如果你觉得我的文章对你有帮助,请赞一下,非常感谢!


阅读(2539) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~