zoukankan      html  css  js  c++  java
  • 列出叶结点

    对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。

    输入格式:

    首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 "-"。编号间以 1 个空格分隔。

    输出格式:

    在一行中按规定顺序输出叶节点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。

    输入样例:

    8
    1 -
    - -
    0 -
    2 7
    - -
    - -
    5 -
    4 6
    
     

    输出样例:

    4 1 5
    
     
     
     1 #include <iostream>
     2 #include <queue>
     3 #include <vector>
     4 #include <cstring>
     5 #define MAXSIZE 10
     6 using namespace std;
     7 
     8 struct TreeNode {
     9     char data;
    10     int cl;
    11     int cr;
    12 } t[MAXSIZE];
    13 queue<int> q;
    14 vector<int> v;
    15 int CreateTree(struct TreeNode t[]) {
    16     int N, root;
    17     cin >> N;
    18     if(!N) return -1;
    19     int check[N];//用来标记该结点是否有父节点
    20     memset(check, 0, sizeof(check));
    21     for(int i=0; i<N; ++i) {
    22         t[i].data=i+'0';
    23         char tcl, tcr;
    24         cin >> tcl >> tcr;
    25         if(tcl!='-') {
    26             t[i].cl = tcl-'0';
    27             check[t[i].cl] = 1;
    28         }
    29         else t[i].cl = -1;
    30         if(tcr!='-') {
    31             t[i].cr = tcr-'0';
    32             check[t[i].cr] = 1;
    33         }
    34         else t[i].cr = -1;
    35     }
    36     int index;
    37     for(index=0; index<N; index++) {
    38         if(!check[index]) break;//没有父结点则为根结点
    39     }
    40     root = index;
    41     return root;
    42 }
    43 void bfs(){
    44     for(int i=0;i<q.size();i++){
    45         int temp=q.front();
    46         q.pop();
    47         if(t[temp].cl==-1 && t[temp].cr==-1)
    48             v.push_back(temp);
    49         if(t[temp].cl!=-1)
    50             q.push(t[temp].cl);
    51         if(t[temp].cr!=-1)
    52             q.push(t[temp].cr);    
    53     }
    54     if(q.size()) bfs();
    55 }
    56 int main(){
    57     int r=CreateTree(t);
    58     q.push(r);
    59     bfs();
    60     for(auto it=v.begin();it!=v.end();it++){
    61         if(it!=v.begin())
    62             cout << " ";
    63         cout << *it;
    64     }
    65     cout << endl;
    66 }

    解析:1、创建结构体并生成树;   2、找到树的根结点并放进队列,然后利用广度优先遍历将叶子结点放进vector,将非叶子结点放进queue,运用递归应用到整个结构体数组;   3、打印vector。

  • 相关阅读:
    hdu 1058
    hdu 1003
    hdu 1500
    hdu 1083 最大匹配
    hdu 1370 中国剩余定理
    hdu 1299 数论 分解素因子
    hdu 1299
    poj 1144 求割点
    hdu 1068 最大独立集合
    hdu 1054
  • 原文地址:https://www.cnblogs.com/i-chase/p/13195832.html
Copyright © 2011-2022 走看看