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



  • 相关阅读:
    Java异常处理和设计
    一次qps测试实践
    Alternate Task UVA
    Just Another Problem UVA
    Lattice Point or Not UVA
    Play with Floor and Ceil UVA
    Exploring Pyramids UVALive
    Cheerleaders UVA
    Triangle Counting UVA
    Square Numbers UVA
  • 原文地址:https://www.cnblogs.com/huoyao/p/4248898.html
Copyright © 2011-2022 走看看