zoukankan      html  css  js  c++  java
  • HDU 1710 Binary Tree Traversals

    题意:给出一颗二叉树的前序遍历和中序遍历,输出其后续遍历

    首先知道中序遍历是左子树根右子树递归遍历的,所以只要找到根节点,就能够拆分出左右子树

    前序遍历是按照根左子树右子树递归遍历的,那么可以找出这颗树的根节点,

    然后拆分出左右子树,对左右子树进行相同的操作,也就是将建树的这个函数递归调用下去

    build函数还是理解了好久啊话说= =仍然是学习的代码

     1 #include<iostream>  
     2 #include<cstdio>  
     3 #include<cstring> 
     4 #include <cmath>   
     5 #include<algorithm>  
     6 using namespace std;
     7 
     8 typedef long long LL;
     9 const int maxn=1005;
    10 
    11 void build(int n,int *s1,int *s2,int *s){
    12     if(n<=0) return;
    13     int p;
    14     for(int i=0;i<n;i++){
    15         if(s2[i]==s1[0]){
    16             p=i;//在中序遍历中找到根结点的位置 
    17             break;
    18         }
    19     }
    20     
    21     build(p,s1+1,s2,s);//p为左子树的区间长度,s1+1是在前序遍历中左子树的开头,s2是在中序遍历中左子树的开头 
    22     build(n-p-1,s1+p+1,s2+p+1,s+p);//n-p-1为右子树的区间长度,s1+p+1 是在前序遍历中右子树的开头,s2是在中序遍历中右子树的开头 
    23     s[n-1]=s1[0];
    24 }
    25 
    26 int main()
    27 {
    28     int n,i,ans[maxn],s1[maxn],s2[maxn];
    29     while(scanf("%d",&n)!=EOF){
    30         for(i=0;i<n;i++) scanf("%d",&s1[i]);
    31         for(i=0;i<n;i++) scanf("%d",&s2[i]);
    32         build(n,s1,s2,ans);
    33         for(i=0;i<n-1;i++) printf("%d ",ans[i]);
    34         printf("%d
    ",ans[i]);
    35     }
    36     return 0;
    37 }
    View Code
  • 相关阅读:
    HDU1879 kruscal 继续畅通工程
    poj1094 拓扑 Sorting It All Out
    (转)搞ACM的你伤不起
    (转)女生应该找一个玩ACM的男生
    poj3259 bellman——ford Wormholes解绝负权问题
    poj2253 最短路 floyd Frogger
    Leetcode 42. Trapping Rain Water
    Leetcode 41. First Missing Positive
    Leetcode 4. Median of Two Sorted Arrays(二分)
    Codeforces:Good Bye 2018(题解)
  • 原文地址:https://www.cnblogs.com/wuyuewoniu/p/4333302.html
Copyright © 2011-2022 走看看