【剑指offer】 重建二叉树

摘要



剑指offer面试题5:


二叉树的节点的定义如下:

struct  BinaryTreeNode
{
	int _data;//二叉树数据
	BinaryTreeNode*  _left;//左孩子指针
	BinaryTreeNode*  _right;//右孩子指针
	BinaryTreeNode(const  int data)
		:_data(data)
		,_left(NULL)
		,_right(NULL)
	{}
};

解决方法:


在二叉树中 ,,,

前序遍历------就是   先访问的是根节点,再访问左边节点,最虎访问的是 右边节点

中序遍历------就是   先访问的是左边节点,再访问根节点,最后访问的是 右边节点


我们先来分析一下这个题 :

二叉树的先序遍历 第一个遍历的节点 一定是  根节点


二叉树的中序遍历 首先遍历的节点是  一定是 根节点的左子树

那么 、、、前序遍历结果和中序遍历的结果   就可以分成三部分   如下图所示:



通过前序遍历和中序遍历的特点,,我们已经可以初步得到该二叉树的  三部分:

1、根节点  
2、左右 子树的前序遍历序列;
3、左右子树的中序遍历序列。


分析到此处、、、我们很多的人都会想到   使用递归,,,,  
将左右子树的前中序遍历出 当成是    一颗 二叉树的  前中序遍 历    来说重建二叉树 ,并将建成的二叉树的根节点当做是      原根节点的左右孩子。。。


说道此处,这道题的解法也大致出来了。。。
下面我们来用代码实现一下吧!!!!!!!!!!
//

typedef  BinaryTreeNode  Node;

//[ Prefirst,Prelast]
//实现一个二叉树的递归算法
// 前序序列[ Prefirst,Prelast] 中序序列 [Infirst,Inlast];
Node* _CreateNewTree(int* Prefirst,int * Prelast,int*  Infirst,int *Inlast)
{
	if(Prefirst==Prelast )//当序列只有一个值时,表示当前的字数只有一个节点
		return new Node(*Prefirst);//直接返回一个节点
	int value = *Prefirst;//得到根节点的  value值 
	Node * node= new Node(value);//建立当前子树的根节点
	//找到当前树  它的左右子树的节点个数
	int * first = Infirst;
	int * last = Inlast;
	for(; first<= last;++first)
	{
		if(*first == value)
			break;
	}
	if(first > last)
		assert(false);
	int  n = first - Infirst;//n表示的是左子树的节点个数
	if(first != Infirst)//要是当前树的左子树没有一个节点,,,,就不需要进入递归了。
		node->_left = _CreateNewTree(Prefirst+1,Prefirst+n,Infirst,first-1);
	if(first != Inlast)//要是当前树的右子树没有一个节点,,,,就不需要进入递归了。
		node->_right = _CreateNewTree(Prefirst+ n+1,Prelast,first+1,Inlast);
	return  node;
}
Node*  CreateNewTree(int *  Pre,int * In,int length)
{
	assert(Pre&&In);
	assert(length);//
	return  _CreateNewTree(Pre,Pre+length-1,In,In+length-1);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值