- #include <iostream>
- #include <string>
-
- using namespace std;
-
-
- typedef char DATA_TYPE;
-
- typedef struct tagBINARY_TREE_NODE BINARY_TREE_NODE, *LPBINARY_TREE_NODE;
-
- struct tagBINARY_TREE_NODE
- {
- DATA_TYPE data;
- LPBINARY_TREE_NODE pLeftChild;
- LPBINARY_TREE_NODE pRightChild;
- };
-
-
-
-
-
-
-
-
-
-
- void TreeFromMidPost(LPBINARY_TREE_NODE & lpNode, string mid, string post, int lm, int rm, int lp, int rp)
- {
-
- lpNode = new BINARY_TREE_NODE;
- lpNode->data = post[rp];
- lpNode->pLeftChild = NULL;
- lpNode->pRightChild = NULL;
-
- int pos = lm;
-
- while (mid[pos] != post[rp])
- {
- pos++;
- }
- int iLeftChildLen = pos - lm;
-
- if (pos > lm)
- {
- TreeFromMidPost(lpNode->pLeftChild, mid, post, lm, pos - 1, lp, lp + iLeftChildLen - 1);
- }
-
- if (pos < rm)
- {
- TreeFromMidPost(lpNode->pRightChild, mid, post, pos + 1, rm, lp + iLeftChildLen, rp - 1);
- }
- }
-
-
-
-
-
-
-
-
-
-
- void TreeFromMidPre(LPBINARY_TREE_NODE & lpNode, string mid, string pre, int lm, int rm, int lp, int rp)
- {
-
- lpNode = new BINARY_TREE_NODE;
- lpNode->data = pre[lp];
- lpNode->pLeftChild = NULL;
- lpNode->pRightChild = NULL;
-
- int pos = lm;
-
- while (mid[pos] != pre[lp])
- {
- pos++;
- }
- int iLeftChildLen = pos - lm;
-
- if (pos > lm)
- {
- TreeFromMidPre(lpNode->pLeftChild, mid, pre, lm, pos - 1, lp + 1, lp + iLeftChildLen);
- }
-
- if (pos < rm)
- {
- TreeFromMidPre(lpNode->pRightChild, mid, pre, pos + 1, rm, lp + iLeftChildLen + 1, rp);
- }
- }
-
-
- void PreOrder(LPBINARY_TREE_NODE p)
- {
- if(p != NULL)
- {
- cout << p->data;
- PreOrder(p->pLeftChild);
- PreOrder(p->pRightChild);
- }
- }
-
-
- void MidOrder(LPBINARY_TREE_NODE p)
- {
- if(p != NULL)
- {
- MidOrder(p->pLeftChild);
- cout << p->data;
- MidOrder(p->pRightChild);
- }
- }
-
-
- void PostOrder(LPBINARY_TREE_NODE p)
- {
- if(p != NULL)
- {
- PostOrder(p->pLeftChild);
- PostOrder(p->pRightChild);
- cout << p->data;
- }
- }
-
-
- void Release(LPBINARY_TREE_NODE lpNode)
- {
- if(lpNode != NULL)
- {
- Release(lpNode->pLeftChild);
- Release(lpNode->pRightChild);
- delete lpNode;
- lpNode = NULL;
- }
- }
-
-
- int main(int argc, char* argv[])
- {
- string pre;
- string mid;
- string post;
-
- LPBINARY_TREE_NODE lpRoot;
-
-
- cout<<"程序1已知二叉树的中序与后序序列,求先序序列"<<endl;
- cout<<"请先输入中序序列,回车后输入后序序列:"<<endl;
-
- cin >> mid;
- cin >> post;
-
- TreeFromMidPost(lpRoot, mid, post, 0, mid.size()-1, 0, post.size()-1);
- cout<<"先序遍历结果:";
- PreOrder(lpRoot);
- cout<<endl;
-
- cout<<"中序遍历结果:";
- MidOrder(lpRoot);
- cout<<endl;
-
- cout<<"后序遍历结果:";
- PostOrder(lpRoot);
- cout<<endl;
- Release(lpRoot);
- cout<<endl;
-
- cout<<"程序2已知二叉树的中序与先序序列,求后序序列"<<endl;
- cout<<"请先输入先序序列,回车后输入中序序列:"<<endl;
- cin >> pre;
- cin >> mid;
-
- TreeFromMidPre(lpRoot, mid, pre, 0, mid.size()-1, 0, pre.size()-1);
- cout<<"先序遍历结果:";
- PreOrder(lpRoot);
- cout<<endl;
-
- cout<<"中序遍历结果:";
- MidOrder(lpRoot);
- cout<<endl;
-
- cout<<"后序遍历结果:";
- PostOrder(lpRoot);
- cout<<endl;
- Release(lpRoot);
- cout<<endl;
-
-
- system("pause");
- return 0;
- }