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

原创 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;
}


版权声明:

相关文章推荐

编程之美读书笔记---分层遍历二叉树

层序遍历一颗二叉树。给定一颗二叉树如下: 输出结果: 1 2 3 4 5 6 7 8 给出书上的两种实现: #include #include #include using n...

编程之美读书笔记3:3.10分层遍历二叉树

按照编程之美课本上给出的c语言写法,转化成了java语法。以前觉得层次的话都是用队列,看到这个题之后,才知道用递归的方法解也行,开阔了思路。 import java.util.Scanner;...

《编程之美》读书笔记12: 3.8 求二叉树中节点的最大距离

问题: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。   实际上就是求树的直径。若...

算法竞赛入门经典读书笔记——二叉树

数组的方式很简单,就是从根节点开始1,2,3依次标号,左节点是 父节点*2,右节点是 父节点*2+1。这种方法的缺点就是需要大量的空间保存数组(包括很多空节点)。例如树共有n层,则需要长度为2^n-1...

[读书笔记]树和二叉树[数据结构(c语言)严慧敏]

本篇文章主要解释树和二叉树里面的一些定义,以便对树的进一步学习提供有力的支持。     1.树:就是有N个结点的有限集合。     2.

JAVA编程思想读书笔记

  • 2014-10-22 12:59
  • 82KB
  • 下载

【编程之美】读书笔记:求二进制数中1的个数

问题:求二进制中1的个数。对于一个字节(8bit)的无符号整型变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能的高。         解法一:对于一个八位的二进制数据,除以一个2,原...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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