第三章 -- 重建二叉树
来源:互联网 发布:java可视化界面设计 编辑:程序博客网 时间:2024/05/16 07:31
给定一棵二叉树,假设每个节点都用唯一的字符来表示,具体结构如下:
struct NODE
{
NODE *pLeft;
NODE *pRight;
char chValue;
};
假设已经有了前序遍历和中序遍历的结果,希望通过一个算法重建这棵树。
给定函数的定义如下:
void Rebuild(char *pPreOrder, char *pInOrder, int nTreeLen, NODE **pRoot)
参数:
pPreOrder:以null为结尾的前序遍历结果的字符串数组。
pInOrder:以null为结尾的中序遍历结果的字符串数组。
nTreeLen:树的长度。
pRoot:返回node**类型,根据前序和中序遍历结果重新构建树的根节点。
例如:
前序遍历结果:a b d c e f
中序遍历结果:d b a e c f
重建的树如图:
递归解决问题:
#include <iostream>#define TREELEN 6using namespace std;struct NODE{ NODE *lchild; NODE *rchild; char chValue;};void Rebuild(char *pPreOrder, char *pInOrder, int nTreeLen, NODE **pRoot){ if(pPreOrder==NULL || pInOrder==NULL) return; // 获得前序遍历的第一个节点 NODE *pTemp=new NODE; pTemp->chValue=*pPreOrder; pTemp->lchild=NULL; pTemp->rchild=NULL; if(*pRoot==NULL) *pRoot=pTemp; if(nTreeLen==1) return; // 开始解析字符串 char *p1=pInOrder; char *p2=pInOrder; //int len=0; while(*p1!=*pPreOrder) p1++; //len=p1-p2; int leftlen=(int)(p1-p2); // 左子树长度 int rightlen=nTreeLen-leftlen-1; // 右子树长度 // 重建左子树 if(leftlen>0) //Rebuild(pPreOrder+1, pInOrder, leftlen, &(*pRoot->lchild)); ->优先级大于* Rebuild(pPreOrder+1, pInOrder, leftlen, &((*pRoot)->lchild)); // 重建右子树 if(rightlen>0) //Rebuild(pPreOrder+len+1, pInOrder+len+1, rightlen, &(*pRoot->rchild)); Rebuild(pPreOrder+leftlen+1, pInOrder+leftlen+1, rightlen, &((*pRoot)->rchild));}int PostOrderTraverse(NODE *root){ if(root==NULL) return 0; PostOrderTraverse(root->lchild); PostOrderTraverse(root->rchild); cout<<root->chValue<<endl;} 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); // 后序遍历测试 PostOrderTraverse(pRoot); return 0;}测试用例结果:
- 第三章 -- 重建二叉树
- 编程之美:第三章 结构之法 3.9重建二叉树
- 3.9重建二叉树
- 重建二叉树
- 二叉树重建
- 二叉树重建
- 二叉树的重建
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 二叉树重建
- 二叉树重建
- 重建二叉树
- String类使用内存解析及效率问题
- Android实现数据存储技术 (5中存储方式) 基础中的基础!!!!
- 冒泡排序算法原理及java实现
- Ubuntu 12.04 耳机外放同时有声音解决办法
- Eclipse无法显示Android设计界面而是单纯的view属性界面的解决方案
- 第三章 -- 重建二叉树
- 2012年最有价值的Android开发精品文章荟萃【800篇】
- 排序算法总结和稳定性分析
- 网页初学者,如何使用VS2005搭建编程环境(JavaScript及ASP调试)
- 第 1 个 STL 程序
- c++(重载、覆盖、隐藏) (3)
- c++(重载、覆盖、隐藏) (4)
- mini2440开发板Linux系统自动挂载U盘与SD卡失败的解决方法(转)
- vector, list, deque的使用区别