求二叉树的先序遍历
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历
输入
输入数据有多组,第一行是一个整数t (t<1000),代表有t组测试数据。每组包括两个长度小于50 的字符串,第一个字符串表示二叉树的中序遍历序列,第二个字符串表示二叉树的后序遍历序列。
输出
输出二叉树的先序遍历序列
示例输入
2 dbgeafc dgebfca lnixu linux
示例输出
abdegcf xnliu 代码:#include<stdio.h> #include<iostream> #include<string> #include<algorithm> using namespace std; typedef char DATA_TYPE; //typedef char DATA_TYPE; typedef struct tagBINARY_TREE_NODE BINARY_TREE_NODE, *LPBINARY_TREE_NODE; //struct tagBINARY_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)//string类型就是字符串数组 { //构造二叉树结点 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 PreOrder(LPBINARY_TREE_NODE p) { if(p != NULL) { cout << p->data; //输出该结点 PreOrder(p->pLeftChild);//遍历左子 PreOrder(p->pRightChild); //遍历右子树 } } 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; //存储后序序列?? int n; LPBINARY_TREE_NODE lpRoot; //二叉树根节点指针 scanf("%d",&n); for(int i=0;i<n;i++) { cin >> mid; cin >> post; TreeFromMidPost(lpRoot, mid, post, 0, mid.size()-1, 0, post.size()-1); //cout<<"先序遍历结果:"; PreOrder(lpRoot); cout<<endl; } return 0; }