• 【剑指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



  • 相关阅读:
    Linux中无法使用ifconfig命令
    Linux中运行程序的一些方法介绍
    python中一些函数的使用介绍
    pytorch中DataSet和DataLoader的使用详解
    gensim中有关word2vec的一些使用
    pytorch中比较两个tensor是否相等
    pytorch中的数据类型之间的转换
    pytorch中有关gpu的操作
    pytorch中保存模型
    Vscode配合远程服务器进行python项目开发
  • 原文地址:https://www.cnblogs.com/huoyao/p/4248898.html
Copyright © 2020-2023  润新知