给一颗二叉树的先序遍历,一个中序遍历,求输出后序遍历。
这是大一时候数据结构老师布置的课后作业,当时我记着这道题是我仅有的做错的题,老师还专门给我说过我的算法不合格。但是我后来并没有改正(因为懒)。
我的做法是将这个二叉树恢复出来,然后后序遍历。
当然可以不恢复出来直接搜,但我不觉着那样好写些,好多边界要处理。
/* ID: modengd1 PROG: heritage LANG: C++ */ #include <iostream> #include <stdio.h> #include <memory.h> #include <cstring> #include <string.h> using namespace std; string inorder; string preorder; int N; int a; struct node { string whole; int left; int right; char value; }; node tree[27<<2]; void build(int root) { if(tree[root].whole.size()==0) return; tree[root].value=preorder[a]; a++; int b=tree[root].whole.find(tree[root].value); tree[root].left=N++; tree[root].right=N++; tree[tree[root].left].whole=tree[root].whole.substr(0,b); build(tree[root].left); tree[tree[root].right].whole=tree[root].whole.substr(b+1,tree[root].whole.size()-b); build(tree[root].right); } void output(int root) { if(tree[root].whole.size()==0) return; output(tree[root].left); output(tree[root].right); printf("%c",tree[root].value); } int main() { freopen("heritage.in","r",stdin); freopen("heritage.out","w",stdout); char ch; for(int i=0;scanf("%c",&ch)&&ch!=‘\n‘;i++) inorder.push_back(ch); for(int i=0;scanf("%c",&ch)&&ch!=‘\n‘;i++) preorder.push_back(ch); int root=1; tree[root].whole=inorder; tree[root].value=preorder[0]; a=0; N=2; build(1); output(1); cout<<endl; return 0; }
时间: 2024-10-13 16:01:38