重建二叉树
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!)。
-
输入
-
输入有多组数据(少于100组),以文件结尾结束。
每组数据仅一行,包括两个字符串,中间用空格隔开,分别表示二叉树的后序和中序序列(字符串长度小于26,输入数据保证合法)。
输出
- 每组输出数据单独占一行,输出对应得先序序列。 样例输入
-
ACBFGED ABCDEFG CDAB CBAD
样例输出
-
DBACEGF BCAD
-
详解:http://blog.csdn.net/jakiechen68/article/details/8974167
-
对于一颗二叉树,可以根据先序遍历(后序遍历)和中序遍历重新还原出二叉树。
根据先序遍历和中序遍历还原二叉树的主要思想:
1、先序遍历序列的第一个元素必定是根节点,可以由此获取二叉树的根节点。
2、根据根节点,在中序遍历序列中查找该节点,由中序遍历的性质可知,中序遍历中该根节点左边的序列必定在根节点的左子树中,而根节点右边的序列必定在右子树中。由此可以知道先序遍历中左子树以及右子树的起止位置。
3、分别对左子树和右子树重复上述的过程,直至所有的子树的起止位置相等时,说明已经到达叶子节点,遍历完毕。
-
#ifndef __FUNCTION_H__ #define __FUNCTION_H__ #include <iostream> using namespace std; struct BinaryTreeNode { int nodeValue; BinaryTreeNode *pLeft; BinaryTreeNode *pRight; }; BinaryTreeNode * BuildRecursivly(int *pPrevOrderStart, int *pPrevOrderEnd, int *pInOrderStart, int *pInOrderEnd) { //在先序遍历序列中取出第一个元素即为根节点元素 int value = pPrevOrderStart[0]; //构造根节点 BinaryTreeNode *root = new BinaryTreeNode; root->nodeValue = value; root->pLeft = root->pRight = NULL; //递归结束的情况,即只剩一个叶子节点 if(pPrevOrderStart == pPrevOrderEnd) { if(pInOrderStart == pInOrderEnd && *pPrevOrderStart == *pInOrderStart) return root; else throw std::exception(); } //在中序遍历序列中找出根节点的位置 int *pInOrderCursor = pInOrderStart; while(pInOrderCursor < pInOrderEnd && *pInOrderCursor != value) { pInOrderCursor++; } if(pInOrderCursor == pInOrderEnd && *pInOrderCursor != value) { throw std::exception(); } //取得左子树的长度以及在先序遍历中取得左子树的起始位置 int leftTreeLen = pInOrderCursor - pInOrderStart; int *pPrevOrderLeftTreeEnd = pPrevOrderStart + leftTreeLen; //如果左子树存在,则递归左子树 if(leftTreeLen > 0) { root->pLeft = BuildRecursivly(pPrevOrderStart+1, pPrevOrderLeftTreeEnd, pInOrderStart, pInOrderCursor-1); } //如果右子树存在,则递归右子树 if((pPrevOrderEnd-pPrevOrderStart) > leftTreeLen) { root->pRight = BuildRecursivly(pPrevOrderLeftTreeEnd+1, pPrevOrderEnd, pInOrderCursor+1, pInOrderEnd); } return root; } BinaryTreeNode * BulidBinaryTree(int *szPrevOrder, int *szInOrder, int nodeNum) { if(szPrevOrder == NULL || szInOrder == NULL) return NULL; return BuildRecursivly(szPrevOrder, szPrevOrder+nodeNum-1, szInOrder, szInOrder+nodeNum-1); } /*先序遍历*/ void PrevOrder(BinaryTreeNode *root) { if(root == NULL) return; //根 cout<<root->nodeValue<<' '; //左子树 if(root->pLeft != NULL) PrevOrder(root->pLeft); //右子树 if(root->pRight != NULL) PrevOrder(root->pRight); } /*中序遍历*/ void InOrder(BinaryTreeNode *root) { if(root == NULL) return; //左子树 if(root->pLeft != NULL) InOrder(root->pLeft); //根 cout<<root->nodeValue<<' '; //右子树 if(root->pRight != NULL) InOrder(root->pRight); } /*后序遍历*/ void PostOrder(BinaryTreeNode *root) { if(root == NULL) return; //左子树 if(root->pLeft != NULL) PostOrder(root->pLeft); //右子树 if(root->pRight != NULL) PostOrder(root->pRight); //根 cout<<root->nodeValue<<' '; } #endif
-
输入有多组数据(少于100组),以文件结尾结束。