南阳 重建二叉树
2015-11-27 17:10
141 查看
重建二叉树
时间限制: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
相关文章推荐
- CUDA by Example,运行书中代码的一些问题 (更新中)
- hdu 1558 并查集+计算几何
- leetcode之路048 Rotate Image
- Android手机通用检测指令
- MVC设计模式及其带来的优点
- Nagios and NSCA installation
- 高质量JAVA代码编写规范
- PhpStrom激活
- php xdebug配置
- 23设计模式之观察者模式(Observer)
- jquery弹出框
- 浏览器的工作原理:新式网络浏览器幕后揭秘
- Android studio asserts文件夹应该放哪儿?
- powerDesigner 从数据库导出表结构,并生产excel ,有效
- java正则表达式的应用 java读取文件并获取电话号码
- Dreamweaver CS6最新官方正式中文破解版(32位、64位)
- Ubuntu的窗口3键(最大化、最小化、关闭)消失解决办法
- 通过USB数据线实现Android端与PC端的通信
- POJ3020Antenna Placement(最小路径覆盖+重在构图)
- php 去掉字符串的最后一个字符