zoukankan      html  css  js  c++  java
  • 玩转二叉树

    给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。

    输入格式:

    输入第一行给出一个正整数N≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。

    输出格式:

    在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

    输入样例:

    7
    1 2 3 4 5 6 7
    4 1 3 2 6 5 7
    

    输出样例:

    4 6 1 7 5 3 2
    
     
    这个题和刚刚写的那个类似也是一个建树的过程;
    比如中序是1 2 3 4 5 6  7  前序是 4 1 3 2 6 5 7   由前序可得4是树根,1是4的左孩子,然后通过中序可知1 2 3是左子树5 6 7是右子树,通过前序可知6是4 的右孩子,这样依次递归。
    代码:
      
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <set>
     4 #include <vector>
     5 #include <cstring>
     6 #include <queue>
     7 #include <algorithm>
     8 using namespace std;
     9 typedef long long ll;
    10 const int maxn=1e5+5;
    11 int mid[50],pre[50];
    12 struct node
    13 {
    14     int data;
    15     node *LNode;
    16     node *RNode;
    17 };
    18 node* build(int *mid,int *pre,int n)
    19 {
    20     if(n<=0)return NULL;
    21     int *p=mid;
    22     while(p)
    23     {
    24         if(*p==*pre)
    25             break;
    26         p++;
    27     }
    28     node *T=new node;
    29     T->data=*p;
    30     int len=p-mid;
    31     T->LNode=build(mid,pre+1,len);
    32     T->RNode=build(p+1,pre+len+1,n-len-1);
    33     return T;
    34 }
    35 void cengprint(node *T)
    36 {
    37     queue<node*> q;
    38     q.push(T);
    39     int flag=0;
    40     while(!q.empty())
    41     {
    42         node *x=q.front();
    43         if(!flag)
    44             printf("%d",x->data),flag++;
    45         else
    46             printf(" %d",x->data);
    47         q.pop();
    48         if(x->RNode)
    49             q.push(x->RNode);
    50         if(x->LNode)
    51             q.push(x->LNode);
    52 
    53     }
    54 }
    55 int main()
    56 {
    57     int n;
    58     cin>>n;
    59     for(int i=0;i<n;i++)
    60         scanf("%d",&mid[i]);
    61     for(int i=0;i<n;i++)
    62         scanf("%d",&pre[i]);
    63     node *T;
    64     T=build(mid,pre,n);
    65     cengprint(T);
    66     printf("
    ");
    67     return 0;
    68 }
  • 相关阅读:
    vi命令文件编辑
    Linux vi/vim编辑器常用命令与用法总结
    常用vi编辑器命令行
    在AspNetMvc中使用日志面板. Logdashboard 1.1beta
    Abp中使用可视化的日志面板
    使用logdashboard进行可视化的日志追踪
    可视化面板LogDashboard使用log4net源
    LogDashboard 1.0.4 版本发布
    什么是LogDashboard?
    使用logdashboard查看可视化日志
  • 原文地址:https://www.cnblogs.com/Cherry93/p/9935284.html
Copyright © 2011-2022 走看看