重建二叉树
2014-09-04 10:33
253 查看
编程之美上面的 重建二叉树 实现代码
#include<stdio.h> #include<malloc.h> #define TREELEN 6 struct NODE { NODE *pLeft; NODE *pRight; char chValue; }; void ReBuild(char *pPreOrder, char *pInOrder,int nTreeLen, NODE **pRoot) { //检查边界条件 if(pPreOrder ==NULL || pInOrder ==NULL) { return ; } //获得前序遍历的第一个节点 NODE * pTemp = new NODE; //NODE *pTemp; //if(!(pTemp = (Node *)malloc(sizeof(Node)))) return; pTemp->chValue = *pPreOrder; pTemp->pLeft = NULL; pTemp->pRight = NULL; if(*pRoot == NULL) { *pRoot = pTemp; } if(nTreeLen ==1) { return ; } char *pOrgInOrder = pInOrder; char *pLeftEnd = pInOrder; int nTempLen = 0; //找到左子树的结尾 while(*pPreOrder != *pLeftEnd) { if(pPreOrder ==NULL || pLeftEnd ==NULL) { return ; } nTempLen ++; if(nTempLen > nTreeLen) { break; } pLeftEnd++; } //leftchild Tree length int nLeftLen =0; nLeftLen = int(pLeftEnd - pOrgInOrder); //rightchild Tree length int nRightLen =0; nRightLen = nTreeLen - nLeftLen -1; //reCreate leftchild Tree if(nLeftLen >0) { ReBuild(pPreOrder +1, pInOrder, nLeftLen, &((*pRoot)->pLeft)); } //reCreate rightchild Tree if(nRightLen >0) { ReBuild(pPreOrder+nLeftLen +1,pOrgInOrder + nLeftLen +1,nRightLen, &((*pRoot)->pRight)); } } void PostOrder(NODE *pRoot) { if(pRoot) { PostOrder(pRoot->pLeft); PostOrder(pRoot->pRight); printf("%c",pRoot->chValue); } } int main() { char szPreOrder[TREELEN] = {'a','b','d','c','e','f'}; char szInOrder[TREELEN] = {'d','b','a','e','c','f'}; NODE * pRoot = NULL; ReBuild(szPreOrder, szInOrder,TREELEN,&pRoot); PostOrder(pRoot); printf("\nok!"); return 0; }
相关文章推荐
- 重拾算法之剑指Offier——重建二叉树
- 《苦练算法》-剑指Offer- 四、 重建二叉树 -python编写
- UVA 536 Tree Recovery 二叉树重建(重建二叉树+DFS)
- 剑指Offer面试题7:重建二叉树
- 数据结构与算法分析笔记与总结(java实现)--二叉树24:重建二叉树
- 夕拾算法进阶篇:23)中序和前序|后序|层次重建二叉树
- 由中序和后序重建二叉树
- 【每日一题-16】重建二叉树&C模拟实现C++继承多态
- 剑指offer 面试题6 重建二叉树
- 重建二叉树
- 编程之美--3.9 重建二叉树
- 剑指offer-题6:重建二叉树
- sicily 1935 二叉树重建
- HDU 1710-Binary Tree Traversals(重建二叉树)
- 重建二叉树
- uva 536 Tree Recovery(二叉树重建)
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 根据前序和中序的遍历序列重建二叉树