学习二叉树,看了两天也不明白,唉!acm之路让我体验到要付出巨大的努力,废话不多说,看我网上找到的代码:
此题题意很明确,给你先序遍历,中序遍历,求后序遍历。但代码就让我找不到东西了。
http://acm.hdu.edu.cn/showproblem.php?pid=1710
#include <stdio.h> #include <string.h> void build(int n,int *a,int *b,int *c) { int *p=b; if(n<=0)return; while(1) { if(a[0]==*p) break; else p++; } int x=p-b; build(x,a+1,b,c); build(n-x-1,a+x+1,b+x+1,c+x); c[n-1]=a[0]; } int main() { int n,i; while(~scanf("%d",&n)) { int a[1002],b[1002],c[1002]; for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=0;i<n;i++) scanf("%d",&b[i]); build(n,a,b,c); for(i=0;i<n-1;i++) { printf("%d ",c[i]); } printf("%d ",c[n-1]); } return 0; }
这为结构体指针的一个代码!
#include<stdio.h> #include<stdlib.h> int a[1000],b[1000]; int flag; typedef struct node { int data; struct node *lchild,*rchild; } Tnode,*Tree; int m=sizeof(Tnode); Tree newnode() { Tree p; p=(Tree)malloc(m); p->lchild=NULL; p->rchild=NULL; return p; } void Creat(int i,int j,int k,int t,Tree p)//此处理解甚为重要,建立过程,先自己模拟的过程如果模拟的过程理解了这里就容易许多 { p->data=a[i]; int m; for(m=k; m<=t; m++) { if(a[i]==b[m]) break; } if(m==k)p->lchild=NULL; else { p->lchild=newnode(); Creat(i+1,i+(m-k),k,m-1,(p->lchild));//需要理解的地方 } if(m==t)p->rchild=NULL; else { p->rchild=newnode(); Creat(i+(m-k)+1,j,m+1,t,(p->rchild));//此处也是需要加强理解之处 } } void post(Tree p) { if(p!=NULL) { post(p->lchild); post(p->rchild); if(p->data!=NULL) if(flag==0) { printf("%d",p->data); flag=1; } else printf(" %d",p->data); } } int main() { Tree root; int i,n; while(scanf("%d",&n)!=EOF) { flag=0; for(i=1; i<=n; i++) scanf("%d",&a[i]); for(i=1; i<=n; i++) scanf("%d",&b[i]); root=newnode(); Creat(1,n,1,n,root); post(root); printf(" "); } return 0; }
也许以后会看得懂吧!