zoukankan      html  css  js  c++  java
  • 【剑指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



  • 相关阅读:
    StructureMap经典的IoC/DI容器
    移植的7zip到Vxworks 取名vx7zip
    试验Boost在Vxworks上的应用日记 三
    Log4cpp 崩溃
    试验Boost在Vxworks上的应用日记 一
    Vx7zip改进
    GoAhead 2.5 Web Server 网页ROM化的改进
    试验Boost在Vxworks上的应用日记 二
    原来CoreBluetooth 只支持Bluetooth Low Energy
    可变长结构体
  • 原文地址:https://www.cnblogs.com/huoyao/p/4248898.html
Copyright © 2011-2022 走看看