二叉树的遍历:先序遍历,中序遍历,后序遍历
只要有一个中序序列再加上另一个序列就可唯一地重建原来二叉树。
Sample Input
9
1 2 4 7 3 5 8 9 6
4 7 2 1 8 5 9 3 6
Sample Output
- /*
- 2008-12-28 20:57:43 Accepted 1710 78MS 0K 825 B
- 树的遍历
- 给你一棵树的先序遍历结果和中序遍历的结果,让你求以后序遍历输出
- 用递归。每次把两个数组分成三个部分,父节点,左子树,右子树,把父节点放到栈里边,重复此步骤直到重建一棵新树
- 这时,栈里元素出栈时刚好是后序遍历的顺序
- */
- #include
- #include
- #define N 1001
- using namespace std;
- stackS;//存放父节点
- int pre[N],ino[N];//先序数组和后序数组
- int n;
- void make(int l1,int r1,int l2,int r2)//l1,r1,是先序遍历的数组的开始和末尾,l2,r2是中序的
- {
- int i,j;
- S.push(pre[l1]); //父节点入栈
- for(i=l2;i<=r2;i++) //找到父节点在中序遍历的位置i
- if(ino[i]==pre[l1])
- break;
- j=i-l2+l1+1; //确定左子树和右子树在先序遍历的分界点j,(j对前序起作用,i对中序起作用)
- //后缀遍历是先左、右、根,对应先根、右、左入栈
- if(j<=r1 && i+1<=r2)
- make(j,r1,i+1,r2);//求解右子树(前序,中序)
- if(l1+1<=j-1 && l2<=i-1)
- make(l1+1,j-1,l2,i-1);//求解左子树(前序,中序)
- }
- void print()//输出
- {
- while(!S.empty())
- {
- printf("%d",S.top());
- S.pop();
- if(!S.empty())
- printf(" ");
- }
- printf("\n");
- }
- void init()//输入
- {
- for(int i=1;i<=n;i++)
- scanf("%d",&pre[i]);
- for(i=1;i<=n;i++)
- scanf("%d",&ino[i]);
- }
- int main()
- {
- while(scanf("%d",&n)!=EOF)
- {
- init();
- make(1,n,1,n);
- print();
- }
- return 0;
- }
如何重新一棵树,呢,root->left=make();
root->right=make();
return root;
阅读(1393) | 评论(0) | 转发(0) |