Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2794314
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: C/C++

2012-07-17 21:35:53

二叉树的遍历:先序遍历,中序遍历,后序遍历
只要有一个中序序列再加上另一个序列就可唯一地重建原来二叉树。

Sample Input
9
1 2 4 7 3 5 8 9 6
4 7 2 1 8 5 9 3 6
 

Sample Output
7 4 2 8 9 5 6 3 1
 

点击(此处)折叠或打开

  1. /*
  2.     2008-12-28 20:57:43 Accepted 1710 78MS 0K 825 B
  3.     树的遍历
  4.     给你一棵树的先序遍历结果和中序遍历的结果,让你求以后序遍历输出
  5.     用递归。每次把两个数组分成三个部分,父节点,左子树,右子树,把父节点放到栈里边,重复此步骤直到重建一棵新树
  6.     这时,栈里元素出栈时刚好是后序遍历的顺序
  7. */
  8. #include
  9. #include
  10. #define N 1001
  11. using namespace std;
  12. stackS;//存放父节点
  13. int pre[N],ino[N];//先序数组和后序数组
  14. int n;
  15. void make(int l1,int r1,int l2,int r2)//l1,r1,是先序遍历的数组的开始和末尾,l2,r2是中序的
  16. {
  17.     int i,j;
  18.     S.push(pre[l1]); //父节点入栈
  19.     for(i=l2;i<=r2;i++) //找到父节点在中序遍历的位置i
  20.         if(ino[i]==pre[l1])
  21.             break;
  22.     j=i-l2+l1+1; //确定左子树和右子树在先序遍历的分界点j,(j对前序起作用,i对中序起作用)
  23.     //后缀遍历是先左、右、根,对应先根、右、左入栈
  24.     if(j<=r1 && i+1<=r2)
  25.       make(j,r1,i+1,r2);//求解右子树(前序,中序)
  26.     if(l1+1<=j-1 && l2<=i-1)
  27.       make(l1+1,j-1,l2,i-1);//求解左子树(前序,中序)

  28. }
  29. void print()//输出
  30. {
  31.     while(!S.empty())
  32.     {
  33.         printf("%d",S.top());
  34.         S.pop();
  35.         if(!S.empty())
  36.             printf(" ");
  37.     }
  38.     printf("\n");
  39. }
  40. void init()//输入
  41. {
  42.     for(int i=1;i<=n;i++)
  43.         scanf("%d",&pre[i]);
  44.     for(i=1;i<=n;i++)
  45.         scanf("%d",&ino[i]);
  46. }
  47. int main()
  48. {
  49.     while(scanf("%d",&n)!=EOF)
  50.     {
  51.         init();
  52.         make(1,n,1,n);
  53.         print();
  54.     }
  55.     return 0;
  56. }

如何重新一棵树,呢,root->left=make();
   root->right=make();
return root;

阅读(1368) | 评论(0) | 转发(0) |
0

上一篇:数据库三范式

下一篇:ArrayList&& LinkedList

给主人留下些什么吧!~~