【剑指Offer面试编程题】题目1523:从上往下打印二叉树--九度OJ

题目描述:

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

输入:

输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, :n代表将要输入的二叉树元素的个数(节点从1开始编号)。接下来一行有n个数字,代表第i个二叉树节点的元素的值。接下来有n行,每行有一个字母Ci。
Ci=’d’表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号。
Ci=’l’表示第i个节点有一个左孩子,紧接着是左孩子的编号。
Ci=’r’表示第i个节点有一个右孩子,紧接着是右孩子的编号。
Ci=’z’表示第i个节点没有子孩子。

输出:

对应每个测试案例,
按照从上之下,从左至右打印出二叉树节点的值。

样例输入:

7
8 6 5 7 10 9 11
d 2 5
d 3 4
z
z
d 6 7
z
z
样例输出:

8 6 10 5 7 9 11

【解题思路】这道题目应该一眼就看看出是树的层序遍历,看出来之后也就没有什么可以说的了。注意首先用一定的数据结构保存树,然后利用set数据结构寻找出根节点。然后就是利用队列进行层序遍历。

AC code:

#include <cstdio>
#include <vector>
#include <set>
#include <queue>
using namespace std;
 
struct tr
{
  int val,lc,rc;
};
 
int main()
{
  int n,r,l;
  char cc[2];
  while(scanf("%d",&n)!=EOF)
  {
    tr rt;
    rt.lc=rt.rc=0;
    vector<tr> vect(n+1);
    set<int> setidx;
    queue<int> qu;
    for(int i=1;i<=n;++i)
    {
      scanf("%d",&rt.val);
      vect[i]=rt;
      setidx.insert(i);
    }
    for(int i=1;i<=n;++i)
    {
      scanf("%s",cc);
      switch(cc[0]){
      case 'd':
        scanf("%d%d",&l,&r);
        vect[i].lc=l;
        vect[i].rc=r;
        setidx.erase(l);
        setidx.erase(r);
        break;
      case 'l':
        scanf("%d",&l);
        vect[i].lc=l;
        setidx.erase(l);
        break;
      case 'r':
        scanf("%d",&r);
        vect[i].rc=r;
        setidx.erase(r);
        break;
      case 'z':
        break;
      default:
        break;
      }
    }
    printf("%d",vect[*setidx.begin()].val);
    if(vect[*setidx.begin()].lc!=0)
      qu.push(vect[*setidx.begin()].lc);
    if(vect[*setidx.begin()].rc!=0)
      qu.push(vect[*setidx.begin()].rc);
    while(!qu.empty())
    {
      int ft=qu.front();
      printf(" %d",vect[ft].val);
      if(vect[ft].lc!=0)
        qu.push(vect[ft].lc);
      if(vect[ft].rc!=0)
        qu.push(vect[ft].rc);
      qu.pop();
    }
    printf("
");
  }
  return 0;
}
/**************************************************************
    Problem: 1523
    User: huo_yao
    Language: C++
    Result: Accepted
    Time:0 ms
    Memory:1056 kb
****************************************************************/
题目链接:http://ac.jobdu.com/problem.php?pid=1523

九度-剑指Offer习题全套答案下载:http://download.csdn.net/detail/huoyaotl123/8276299



原文地址:https://www.cnblogs.com/huoyao/p/4248898.html