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
  • 相关阅读:
    主成分分析法
    K-means算法
    高斯混合模型
    data structure test
    八皇后问题求解
    商品管理系统课程设计
    哈佛商学院20部必看电影
    usaco1.1
    Visual Studio 2012 出现关于ActivityLog.xml错误的解决方案
    2012蓝桥杯决赛题
  • 原文地址:https://www.cnblogs.com/wuyuewoniu/p/4333302.html
Copyright © 2011-2022 走看看