给出一二叉树的前序遍历的顺序和中序遍历的顺序我们可以由此得出后序遍历的顺序,根据它们的访问顺序,前序遍历的第一个结点肯定是根结点,与之对应在中序遍历找到对应的根结点的位置,那么在中序遍历中,根结点的左边的元素都属于左子树的元素,根结点右边的元素都属于右子树的元素,之后把左子树当成一个继续操作,就这样可以推出整个树,继而求出后序遍历:
#include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #define MAX_SIZE 100+10 using namespace std; typedef struct TREENODE { char data; TREENODE *lchild; TREENODE *rchild; }*treenode; void postorder(treenode t) { if(t) { postorder(t->lchild); postorder(t->rchild); cout << t->data; } } treenode creatpost(char *pre, char *in, int len) { if(len <= 0) return NULL; treenode t = (treenode)malloc(sizeof(treenode)); t->data = *pre; char *p; for(p = in;p!=NULL;p++) if(*p == *pre) break; int k = p-in; t->lchild = creatpost(pre+1, in, k); t->rchild = creatpost(pre+k+1, p+1, len-k-1); return t; } int main() { char pre[MAX_SIZE], in[MAX_SIZE]; //存储前序遍历和中序遍历 treenode t; while(scanf("%s%s", pre, in) != EOF) { int len = strlen(pre); t = creatpost(pre, in, len); //建树 postorder(t); //后序遍历访问 cout << endl; } return 0; }
#include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #define MAX_SIZE 100+10 using namespace std; typedef struct TREENODE { char data; TREENODE *lchild; TREENODE *rchild; }*treenode; treenode creatpre(char *in,char *post,int len) { if(len<=0) return NULL; treenode t; t = (treenode)malloc(sizeof(treenode)); t->data = post[len-1]; int p,i; for(i=0;i<len;i++) if(post[len-1]==in[i]) { p=i; break; } t->lchild = creatpre(in , post, p); t->rchild = creatpre(in+p+1, post+p, len-p-1); return t; }; void preorder(treenode t) { if(t) { printf("%c", t->data); preorder(t->lchild); preorder(t->rchild); } } int main() { char in[MAX_SIZE], post[MAX_SIZE]; while(scanf("%s%s", in, post)) { treenode t; int len = strlen(in); t = creatpre(in, post, len); preorder(t); printf("\n"); } return 0; }
D
/
E
前序遍历: DE, 后序遍历: ED
则下面树的结构也满足前序和后序遍历的序列。
D
\
E
即这种情况,不能唯一确定一棵树。
如果在一个二叉树中,只存在度为0和度为2的结点,那么可以通过前序遍历和后序遍历确定惟一的一颗树,否则这个二叉树就不能被唯一确定。
原文:http://blog.csdn.net/fk5431/article/details/45772845