免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5859 | 回复: 16
打印 上一主题 下一主题

[算法] 09年计算机考研统考试题第3题 数据结构 二叉树遍历的问题! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-06 20:25 |只看该作者 |倒序浏览
试题我截成图片在附件。
遍历的结点序列为3,1,7,5,6,2,4,可这个序列我怎么看都不觉得是RNL啊,它右子树根本就没遍历完,如果是先遍历右子树,那3、5、6、7都要先于1遍历啊。这到底是怎么看的啊?各位大侠教教我啊!!

[ 本帖最后由 pz0513 于 2009-12-9 19:52 编辑 ]

QQ截图未命名.jpg (29.21 KB, 下载次数: 38)

这是试题

这是试题

2009年统考计算机考研真题及答案.pdf

321.32 KB, 下载次数: 116

这是完整试题

论坛徽章:
0
2 [报告]
发表于 2009-12-06 21:09 |只看该作者
应该是7、5、6、3、1、2、4吧,,题目的遍历方式没规律啊。。煞笔。。。

论坛徽章:
0
3 [报告]
发表于 2009-12-06 21:39 |只看该作者

回复2楼_unistd_

原帖由 _unistd_ 于 2009-12-6 21:09 发表
应该是7、5、6、3、1、2、4吧,,题目的遍历方式没规律啊。。煞笔。。。


我觉得应该是3、7、5、6、1、2、4吧?

论坛徽章:
0
4 [报告]
发表于 2009-12-07 01:01 |只看该作者
用代码一试就看出来是RNL,不过不是书上说的那种简单的RNL。
这个要双堆栈,或者双重递归(两个递归函数)来实现。
人家考的就是思想。

  1. #include <iostream>
  2. #include <stack>
  3. using namespace std;
  4. class Node
  5. {
  6. public:
  7.         int m_nNumber;
  8.         Node* m_pLeft;
  9.         Node* m_pRight;
  10.         void AppendLeft( Node* pChild )
  11.         {
  12.                 m_pLeft = pChild;
  13.         }
  14.         void AppendRight( Node* pChild )
  15.         {
  16.                 m_pRight = pChild;
  17.         }
  18.         Node( int nNumber ) : m_nNumber( nNumber ){}
  19. };

  20. class Tree
  21. {
  22. public:
  23.         Tree( Node* pRoot = NULL ) : m_pRoot( pRoot ){}
  24.         void Traverse()
  25.         {
  26.                 stack< Node* > RootsHaveRight;
  27.                 stack< Node* > Lefts;
  28.                 Node* pTemp = m_pRoot;

  29.                 while ( pTemp )
  30.                 {
  31.                         if ( pTemp->m_pRight )
  32.                         {
  33.                                 RootsHaveRight.push( pTemp );
  34.                                 if ( pTemp->m_pLeft )
  35.                                 {
  36.                                         Lefts.push( pTemp->m_pLeft );
  37.                                 }
  38.                                 pTemp = pTemp->m_pRight;
  39.                         }
  40.                         else if ( ! pTemp->m_pRight && pTemp->m_pLeft )
  41.                         {
  42.                                 cout << pTemp->m_nNumber << " ";
  43.                                 if ( ! RootsHaveRight.empty() )
  44.                                 {
  45.                                         cout << RootsHaveRight.top()->m_nNumber << " ";
  46.                                         RootsHaveRight.pop();
  47.                                 }
  48.                                 pTemp = pTemp->m_pLeft;
  49.                         }
  50.                         else if ( ! pTemp->m_pLeft )
  51.                         {
  52.                                 cout << pTemp->m_nNumber << " ";
  53.                                 if ( ! RootsHaveRight.empty() )
  54.                                 {
  55.                                         cout << RootsHaveRight.top()->m_nNumber << " ";
  56.                                         RootsHaveRight.pop();
  57.                                 }       
  58.                                 if ( ! Lefts.empty() )
  59.                                 {
  60.                                         pTemp = Lefts.top();
  61.                                         Lefts.pop();
  62.                                 }
  63.                                 else
  64.                                 {
  65.                                         cout << endl;
  66.                                         return;
  67.                                 }
  68.                         }
  69.                 }
  70.                
  71.         }
  72.         void Output( const Node* pRoot ) const
  73.         {
  74.                 if ( pRoot )
  75.                 {
  76.                         cout << pRoot->m_nNumber << " ";
  77.                         Output( pRoot->m_pLeft );
  78.                         Output( pRoot->m_pRight );
  79.                 }
  80.         }
  81.         friend ostream& operator<< ( ostream& rOut, const Tree& rTree )
  82.         {
  83.                 rTree.Output( rTree.m_pRoot );
  84.                 return rOut;
  85.         }
  86. private:
  87.         Node* m_pRoot;
  88. };

  89. int main()
  90. {
  91.         Node* pOne = new Node( 1 );
  92.         Node* pTwo = new Node( 2 );
  93.         Node* pThree = new Node( 3 );
  94.         Node* pFour = new Node( 4 );
  95.         Node* pFive = new Node( 5 );
  96.         Node* pSix = new Node( 6 );
  97.         Node* pSeven = new Node( 7 );
  98.         pOne->AppendLeft( pTwo );
  99.         pOne->AppendRight( pThree );
  100.         pTwo->AppendLeft( pFour );
  101.         pThree->AppendLeft( pFive );
  102.         pFive->AppendLeft( pSix );
  103.         pFive->AppendRight( pSeven );

  104.         Tree NewTree( pOne );
  105.         cout << NewTree << endl;
  106.         NewTree.Traverse();
  107.         // mem leak, ooo
  108.         return 0;
  109. }
复制代码

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
5 [报告]
发表于 2009-12-07 01:59 |只看该作者

回复 #4 youshuang 的帖子

呃…… 双堆栈……  双重递归……

求详细解释

论坛徽章:
0
6 [报告]
发表于 2009-12-07 09:42 |只看该作者

回复 #5 OwnWaterloo 的帖子

真的没啥意思,我瞎扯而已。
以后不瞎说了。。。

论坛徽章:
0
7 [报告]
发表于 2009-12-07 09:52 |只看该作者
同问。啥叫“双堆栈或者双重递归”?什么样的逻辑只能用双重堆栈,递归实现?单一的为什么实现不了?

论坛徽章:
0
8 [报告]
发表于 2009-12-07 14:18 |只看该作者
说多了没用。
下面两个递推数列,让你用递归和非递归方式求a(n),你会怎么写。

  1. a(n) = b(n-1)+c(n-1)
  2. b(n) = b(n-1)+b(n-2)
  3. c(n) = c(n-1)+c(n-2)
复制代码


  1. a(n) = a(n-1)+b(n-1)
  2. b(n) = b(n-1)+b(n-2)
复制代码


至少用两个堆栈或者两个递归函数吧,哈哈哈哈。。。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
9 [报告]
发表于 2009-12-07 14:32 |只看该作者

回复 #8 youshuang 的帖子

这个和二叉树遍历有什么关系吗?
恰好可以解释题目的答案?

论坛徽章:
0
10 [报告]
发表于 2009-12-07 15:28 |只看该作者

回复 #6 youshuang 的帖子

你仔细看看那道题,觉不觉得有错啊?一个选项都不是啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP