3.9 重建二叉树
2015-05-07 11:05
369 查看
题目:给定一颗树的先序遍历结果和中序遍历的结果,重建这颗树。
例如:
前序:a b d c e f
中序:d b a e c f
a是根节点。
思路:根据前序,可以很快找出根节点a,然后根据中序,可以找出根节点a的左右子树,然后递归求a的左子树前序b d跟中序d b,a的右子树前序c e f跟中序e c f即可
代码:
例如:
前序:a b d c e f
中序:d b a e c f
a是根节点。
思路:根据前序,可以很快找出根节点a,然后根据中序,可以找出根节点a的左右子树,然后递归求a的左子树前序b d跟中序d b,a的右子树前序c e f跟中序e c f即可
代码:
struct pNode { pNode *pLeft; pNode *pRight; char ch; }; void reBuild(char *pPreOrder, char *pInOrder, int treeLength, pNode **pRoot) { if(pPreOrder == NULL || pInOrder == NULL) return ; //检查边界条件 pNode *pTemp = new pNode; //获得前序遍历的第一个节点 pTemp->pLeft = NULL; pTemp->pRight = NULL; pTemp->ch = *pPreOrder; if(*pRoot == NULL) *pRoot = pTemp; //如果节点为空,把当前节点复制到根节点 if(treeLength == 1) return ; //如果当前树的长度是1,那么已经是最后一个节点了 char *pLeftEnd = pInOrder; //用来寻找左子树的长度 int nTempLen = 0; while(*pLeftEnd != *pPreOrder) { //利用中序遍历的结果来找到左子树的结尾 if(pLeftEnd == NULL || pPreOrder == NULL) return ; nTempLen++; if(nTempLen > treeLength) break; //记录临时长度,以免溢出 pLeftEnd++; } int nLeftLen = (int)(pLeftEnd - pInOrder); //记录左子树的长度 int nRightLen = treeLength - nLeftLen - 1; //记录右子树的长度 if(nLeftLen > 0) { //重建左子树 reBuild(pPreOrder+1, pInOrder, nLeftLen, &((*pRoot)->pLeft)); } if(nRightLen > 0) { //重建右子树 reBuild(pPreOrder+nLeftLen+1, pInOrder+nLeftLen+1, nRightLen, &((*pRoot)->pRight)); } }
相关文章推荐
- 编程之美 3.9 重建二叉树 扩展问题
- 编程之美3.9---重建二叉树&&判断结果是否能够重建
- 编程之美-3.9-重建二叉树
- 编程之美读书笔记_3.9_重建二叉树
- 重建二叉树_《编程之美》3.9
- 《编程之美》3.9重建二叉树
- 《编程之美》3.9重建二叉树
- 重建二叉树(剑指offer6、编程之美3.9)
- 编程之美——3.9重建二叉树和3.10分层遍历二叉树(Java and C++)
- [编程之美3.9]重建二叉树
- 3.9重建二叉树
- 编程之美3.9 重建二叉树
- 编程之美 3.9 :重建二叉树
- 编程之美3.9 重建二叉树
- 3.9重建二叉树(各种方案的分析比较及扩展问题的分析)
- 编程之美:第三章 结构之法 3.9重建二叉树
- 编程之美系列: 3.9 重建二叉树
- 3.9重建二叉树(各种方案的分析比较及扩展问题的分析)
- 编程之美--3.9 重建二叉树
- [编程之美] PSet3.9 重建二叉树