程序员面试题精选100题(12)-从上往下遍历二元树[数据结构]

转载 2013年12月05日 17:30:50
题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。

例如输入

      8
    /  \
   6    10
  /\     /\
 5  7   9  11

输出8   6   10   5   7   9   11。

分析:这曾是微软的一道面试题。这道题实质上是要求遍历一棵二元树,只不过不是我们熟悉的前序、中序或者后序遍历。

我们从树的根结点开始分析。自然先应该打印根结点8,同时为了下次能够打印8的两个子结点,我们应该在遍历到8时把子结点610保存到一个数据容器中。现在数据容器中就有两个元素10了。按照从左往右的要求,我们先取出6访问。打印6的同时要把6的两个子结点57放入数据容器中,此时数据容器中有三个元素1057。接下来我们应该从数据容器中取出结点10访问了。注意1057先放入容器,此时又比57先取出,就是我们通常说的先入先出。因此不难看出这个数据容器的类型应该是个队列。

既然已经确定数据容器是一个队列,现在的问题变成怎么实现队列了。实际上我们无需自己动手实现一个,因为STL已经为我们实现了一个很好的deque(两端都可以进出的队列),我们只需要拿过来用就可以了。

我们知道树是图的一种特殊退化形式。同时如果对图的深度优先遍历和广度优先遍历有比较深刻的理解,将不难看出这种遍历方式实际上是一种广度优先遍历。因此这道题的本质是在二元树上实现广度优先遍历。

参考代码:

#include <deque>
#include <iostream>
using namespace std;

struct BTreeNode // a node in the binary tree
{
      int         m_nValue; // value of node
      BTreeNode  *m_pLeft;  // left child of node
      BTreeNode  *m_pRight; // right child of node
};

///////////////////////////////////////////////////////////////////////
// Print a binary tree from top level to bottom level
// Input: pTreeRoot - the root of binary tree
///////////////////////////////////////////////////////////////////////
void PrintFromTopToBottom(BTreeNode *pTreeRoot)
{
      if(!pTreeRoot)
            return;

      // get a empty queue
      deque<BTreeNode *> dequeTreeNode;

      // insert the root at the tail of queue
      dequeTreeNode.push_back(pTreeRoot);

      while(dequeTreeNode.size())
      {
            // get a node from the head of queue
            BTreeNode *pNode = dequeTreeNode.front();
            dequeTreeNode.pop_front();

            // print the node
            cout << pNode->m_nValue << ' ';

            // print its left child sub-tree if it has
            if(pNode->m_pLeft)
                  dequeTreeNode.push_back(pNode->m_pLeft);
            // print its right child sub-tree if it has
            if(pNode->m_pRight)
                  dequeTreeNode.push_back(pNode->m_pRight);
      }
}


转自:http://zhedahht.blog.163.com/blog/static/2541117420072199173643/

程序员面试题精选100题:41-50解题报告

程序员面试题精选100题(41)-把数组排成最小的数[算法]   题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32,  321},则输出这两个...
  • nanjunxiao
  • nanjunxiao
  • 2013年06月25日 18:18
  • 947

程序员面试题精选(12):从上往下遍历二元树

题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。例如输入      8    /  /   6    10  //     // 5  7   9  11输出8  ...
  • yysdsyl
  • yysdsyl
  • 2007年10月24日 14:41
  • 1591

程序员面试题精选100题:51-63解题报告

程序员面试题精选100题(51)-顺时针打印矩阵[算法]   题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 例如:如果输入如下矩阵: 1              2  ...
  • nanjunxiao
  • nanjunxiao
  • 2013年06月26日 00:07
  • 1149

程序员面试题精选100题:11-40解题报告

程序员面试题精选100题(11)-求二元查找树的镜像[数据结构]   题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完...
  • nanjunxiao
  • nanjunxiao
  • 2013年06月25日 14:37
  • 1842

程序员面试题精选100题(59)-字符串的组合[算法]

题目:输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。 分析:在本系列博客的第28题《字符串的排列》中,我们详细讨论了如何用递...
  • GarfieldEr007
  • GarfieldEr007
  • 2016年02月24日 12:19
  • 1044

程序员面试题精选100题(12)-从上往下遍历二元树

http://zhedahht.blog.163.com/blog/static/2541117420072199173643/  题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左...
  • linxhpku
  • linxhpku
  • 2009年05月04日 13:50
  • 191

[程序员面试题精选100题]58.八皇后问题

题目在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法。请求出总共有多少种摆法。...
  • SunnyYoona
  • SunnyYoona
  • 2015年04月04日 22:14
  • 1273

从上往下遍历二元树[数据结构]

From: http://zhedahht.blog.163.com/blog/static/2541117420072199173643/ 题目:输入一颗二元树,从上往下按层打印树的每...
  • Vast_Sea
  • Vast_Sea
  • 2012年11月13日 23:37
  • 723

程序员面试题100题第12题——从上往下遍历二元树

题目:略 分析:即层序遍历二叉树; 参考二叉树基本操作
  • zjhhust
  • zjhhust
  • 2012年10月04日 21:37
  • 294

从上往下遍历二元树

#include #include #include using namespace std; //创建树结构 typedef struct node { int data; struct...
  • lzaiwei
  • lzaiwei
  • 2014年09月02日 15:26
  • 234
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:程序员面试题精选100题(12)-从上往下遍历二元树[数据结构]
举报原因:
原因补充:

(最多只允许输入30个字)