码迷,mamicode.com
首页 > 其他好文 > 详细

[树结构]二叉树的重建和序列化

时间:2015-08-29 16:38:27      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:

二叉树的重建

几乎所有的人都知道二叉树可以根据前序遍历+中序遍历或者后序遍历+中序遍历的方式重新建立原来的二叉树,并且结果是唯一的。下面就来看一下相关的方法。

前序+中序重建二叉树

给定一棵二叉树的前序和中序遍历序列,重新建立这棵二叉树。

注意:在前序中确定了根节点以后,要去中序里面查找这个根节点,这时的查找没必要从数组的0下面开始,从这个树的中序的第一个点开始。然后查找的个数为停止的下表减去中序开始的下表。

这里重建二叉树用的是递归的方法,要注意递归的出口。不然会死循环。

所以代码实现:

TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) 
{
	int preStart = 0;
	int preLast = preorder.size() - 1;
	int inStart = 0;
	int inLast = inorder.size() - 1;
	
	return SubTreeBuild(preorder, preStart, preLast, inorder, inStart, inLast);
}

TreeNode* SubTreeBuild(vector<int>& preorder, int preStart, int preLast, vector<int>& inorder, int inStart, int inLast)
{
	if(preStart > preLast || inStart > inLast)
		return NULL;
		
	TreeNode *root = new TreeNode(preorder[preStart]);
	//search the root in the inorder
	int i = inStart;
	while(inorder[i] != preorder[preStart])
	{
		++i;
	}
	
	root->left = SubTreeBuild(preorder, preStart + 1, preStart + i - inStart, inorder, inStart, i - 1);
	root->right = SubTreeBuild(preorder, preStart + 1 + i - inStart, preLast, inorder, i + 1, inLast);
	
	return root;
	
}//SubTreeBuild

后序+中序重建二叉树

其实递归的方式并不是难点,重要的是定边界值。

TreeNode* SubTreeBuild(vector<int>& inorder, int ileft, int iright, vector<int>& postorder, int pleft, int pright)
{
	if(ileft > iright || pleft > pright)
		return NULL;
	
	TreeNode *root = new TreeNode(postorder[pright]);
	
	//search the root node in the inorder
	int i = ileft;
	while(inorder[i] != postorder[pright])
	{
		++i;
	}
	
	root->left = SubTreeBuild(inorder, ileft, i - 1, postorder, pleft, pleft + i - ileft - 1);
	root->right = SubTreeBuild(inorder, i + 1, iright, postorder, pleft + i - ileft, pright - 1);
	
	return root;
}

二叉树的序列化和反序列化

  

 

 

[树结构]二叉树的重建和序列化

标签:

原文地址:http://www.cnblogs.com/stemon/p/4769181.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!