编程之美读书笔记-重建二叉树

原创 2016年08月30日 19:20:58

题目:给定一棵二叉树,假设每个节点都用唯一的字符来表示,具体结构如下。

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**类型,根据前序遍历和中序遍历结果重新构建树的根节点。 
例如 
前序遍历结果:abdcef 
中序遍历结果:dbaecf 
重建的树如图所示。

解析:a是前序遍历节点中的第一个元素,可以看出,它把中序遍历的结果分成db和ecf两个部分。如果能够找到前序遍历中对应的左子树和右子树,就可以把a作为当前的根节点,然后依次递归下去,这样就能够依次恢复左子树和右子树的遍历结果。

#include<iostream>  
using namespace std; 
#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;
	pTemp->chValue = *pPreOrder;
	pTemp->pLeft = NULL;
	pTemp->pRight = NULL;
	//如果节点为空,令当前节点pRoot的地址等于pTemp的地址  
	if (*pRoot == NULL) *pRoot = pTemp;
	//如果当前树长度为1,那么已经是最后一个节点  
	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++;
	}
	//寻找左子树长度  
	int nLeftLen = 0;
	nLeftLen = (int)(pLeftEnd - pOrgInOrder);
	//寻找右子树长度  
	int nRightLen = 0;
	nRightLen = nTreeLen - 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));
}

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);
	system("PAUSE");
	return 0;
}


编程之美--重建二叉树

给定一个前序和中序变量的结果,写一个算法重建这棵树:如: 前序: a b d c e f 中序:  d b a e c f 前序遍历的每一个节点,都是当前子树的根节点,同时,以对应的...
  • luyafei_89430
  • luyafei_89430
  • 2013年10月23日 10:02
  • 6942

编程之美读书笔记-买书问题

题目:在节假日的时候,书店一般都会做促销活动。由于《哈利波特》系列相当畅销,店长决定通过促销活动来回馈读者。上柜的《哈利波特》平装书系列中,一共有五卷。假设每一卷单独销售均需8欧元。如果读者一次购买不...
  • qq_32400847
  • qq_32400847
  • 2016年09月09日 20:01
  • 458

java编程之美(一)

实践编程已经有足足6年多时间,也算是有一定经验,经常在工作中遇到各种让人不爽的代码编写方式,今天忍不住要来唠叨下。 为什么叫编程之美? 在我看来,代码有丑陋难看和赏心悦目两类,当然还有介于两者之...
  • tang9140
  • tang9140
  • 2015年11月01日 18:28
  • 1041

编程之美之扩展问题

参考链接:http://blog.csdn.net/wuyuegb2312/article/details/9896831 1.1 让CPU占用率曲线听你指挥 参考: http://blog.csd...
  • jerryzcx
  • jerryzcx
  • 2014年03月06日 23:33
  • 2522

编程之美2.18—数组分割

题目: 有一个没有排序,元素个数为2N的正整数数组。要求把它分割为元素个数为N的两个数组,并使两个子数组的和最接近。 基本思想: 假设数组A[1..2N]所有元素的和是SUM。模仿动...
  • wtyvhreal
  • wtyvhreal
  • 2015年04月28日 11:37
  • 681

2014-04-19编程之美初赛题目及答案解析

第一题: 描述 一般来说,我们采用针孔相机模型,也就是认为它用到的是小孔成像原理。 在相机坐标系下,一般来说,我们用到的单位长度,不是“米”这样的国际单位,而是相邻像素的长度。而焦距...
  • kunlong0909
  • kunlong0909
  • 2014年04月19日 16:44
  • 4461

[编程之美-10]面试当中的智力题(不定期更新)

[版权说明]  编程之美系列算法题集参考:  左程云 著《程序员代码面试指南IT名企算法与数据结构题目最优解》  July 著《编程之法面试和算法心得》  何海涛 著《剑指offer》  微软编程之美...
  • caicaiatnbu
  • caicaiatnbu
  • 2017年06月07日 23:44
  • 395

《编程之美》学习笔记——指挥CPU占用率

问题: 写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率(单核)。有以下几种情况: 1.CPU占用率固定在50%,为一条直线 2.CPU的占用率为一条直线,具...
  • lyh03601
  • lyh03601
  • 2014年09月28日 15:07
  • 1175

《编程之美》- 3.3 - 计算字符串相似度 即 最小编辑距离问题

题目 3.3计算字符串的相似度 许多程序会大量使用字符串,对于不同的字符串,我们希望能够有办法判断其相似程度。定义下列操作方法使得两个不同的字符串变得相同: 修改一个字符(如把‘a’改为...
  • fly_yr
  • fly_yr
  • 2016年05月24日 20:07
  • 715

编程之美2.21 只考加法的面试题

题目: 我们知道:1+2=3;              4+5=9;              2+3+4=9; 等式左边都是两个以上连续的自然数相加,那么是不是所有的整数都可以写成这种形式...
  • huahuahailang
  • huahuahailang
  • 2013年04月16日 15:26
  • 3481
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编程之美读书笔记-重建二叉树
举报原因:
原因补充:

(最多只允许输入30个字)