重建二叉树

原创 2016年05月30日 13:35:39

    二叉树是我们学习数据结构阶段一个重要的知识点,二叉树又被分为满二叉树,完全二叉树和其它三种来学习,所谓的满二叉树是指我们的二叉树的每一个非叶子节点一定含有左孩子和右孩子,而完全二叉树则是指我们的树的叶子节点必须连续的分布在树的左边。

    今天,我们来探索一下如何在知道二叉树前序遍历顺序及中序遍历顺序来重建二叉树

    首先,重建我们的二叉树,必须要找到根节点,那么根节点应该如何找到呢。如下图所示,根结点必定是我们前序遍历数组的首元素。在知道了根节点的情况下,我们就可以在我们的中序遍历序列里找到我们需要的根节点所在。只要有了根节点的位置,我们很容易就可以确定左树节点个数,以及右树的节点个数。而我们很清楚,在二叉树这里我们大多采用递归来解决子问题,所以显而易见的,我们将根节点的左子树和右子树转换成为子问题来解决更加容易理解。

wKioL1cp4Ljgs5RrAAALCZNRp2Y032.png

    下面我给出了本题的详细代码以及注释j_0046.gif

struct BinaryTreeNode
{
	int _value;
	BinaryTreeNode *_left;
	BinaryTreeNode *_right;
	BinaryTreeNode(const int& x = 0) :_value(x), _left(NULL), _right(NULL)
	{}
};
class BinaryTree
{
private:
	BinaryTreeNode *_root;
public:
	BinaryTree()
	{}
	BinaryTree(int *PreOrder, int *InOrder,int size)
	{
		if (!PreOrder || !InOrder || size <= 0)
			return;
		_root = _CreateTree(PreOrder, PreOrder + size - 1, InOrder, InOrder + size - 1);
	}
private:
	BinaryTreeNode* _CreateTree(int *Pre,int *endPre,int *In,int *endIn)
	{
		//构造当前根节点root 
		int RootValue = Pre[0];
		BinaryTreeNode *root = new BinaryTreeNode(RootValue);
		
		//当走到最后一个元素
		if (Pre == endPre)
		{
			//如果中序也走到了最后一个节点
			//最后一个节点相等说明最后一个节点是一个右分支
			if (In == endIn && *Pre == *In)
				return root;
		}

		//在中序遍历中找到根节点
		int *rootIn = In;
		while (rootIn <= endIn && *rootIn != RootValue)
		{
			//当它等于前序首元素时表示为中序的根节点
			++rootIn;
		}
		//找到之后计算出左子树的节点数
		int leftLen = rootIn - In;

		//找出前序里左子树的构造区间
		int *PreLeftEnd = Pre + leftLen;
		if (leftLen > 0)
		{
			//构造左子树
			root->_left = _CreateTree(Pre + 1, PreLeftEnd  , In, rootIn - 1);
		}

		if (leftLen < endPre - Pre)
		{
			//构造右子树
			root->_right = _CreateTree(PreLeftEnd + 1, endPre, rootIn + 1, endIn);
		}
		return root;

	}
};
int main()
{
	int Pre[] = { 1, 2, 4, 5, 3, 6 };
	int In[] = { 4, 2, 5, 1, 6, 3};
	BinaryTree tree(Pre, In, sizeof(Pre) / sizeof(Pre[0]));
	getchar();
	return 0;
}

    如果实在不能理解建议在纸上将整个过程整理一遍,相信这样就会对树的建立以及递归的算法有深刻的理解,显然博主就经常这么做~j_0048.gif

本文出自 “Zimomo” 博客,请务必保留此出处http://zimomo.blog.51cto.com/10799874/1770149

版权声明:本文为博主原创文章,未经博主允许不得转载。

剑指Offer面试题6(Java版):重建二叉树

题目:输入某二叉树的前序遍历和中序遍历的结果,请重新构造出该二叉树。假设输入的前序遍历和中序遍历的结果中不包含重复的数字。例如输入的前序遍历序列为{1,2,4,7,3,5,6,8}和中序遍历为{4,7...
  • jsqfengbao
  • jsqfengbao
  • 2015年07月27日 18:36
  • 4861

数据结构:关于重建二叉树的三种思路

如果,告诉你有一棵二叉树前序遍历的结果为:ABC;中序遍历的结果为:BAC。我们可以很轻松地写出这棵二叉树就是以A为根节点、其左孩子是B、右孩子是C。那么从代码的角度,或者说是从算法的角度又要怎么来编...
  • u013761665
  • u013761665
  • 2015年11月24日 00:27
  • 4688

POJ 2255 二叉树的重建

很不错的一道题目,t
  • he012
  • he012
  • 2014年07月21日 10:48
  • 225

剑指offer--重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5...
  • kangaroo835127729
  • kangaroo835127729
  • 2015年04月10日 22:57
  • 1972

编程之美--重建二叉树

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

openjudge 重建二叉树3

建立二叉树3 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65535kB 描述 给出一颗二叉树每层节点的字符串表示,建立这颗二叉树,并输出中序遍历的结果。   输入 第一行输入一个...
  • kucece
  • kucece
  • 2015年06月05日 20:21
  • 411

java实现重建二叉树

题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,...
  • Bryan__
  • Bryan__
  • 2016年09月02日 12:10
  • 1371

重建二叉树 C语言实现

主要根据编程之美中利用前序与中序遍历实现二叉树的重构。其中对于前序遍历中的每一个节点都是当前子树的根节点这一理论来对中序遍历进行划分。 并且也实现了根据中序遍历与后序遍历实现二叉树的重构,其中对于后...
  • yyme411
  • yyme411
  • 2013年11月08日 20:01
  • 1107

Java笔记---剑指Offer(一:Java实现重建二叉树)

一、前言 最近正在准备找实习,因此拿起《剑指Offer》来看看,突击下自己的基础。但是《剑指Offer》上面的算法都是使用C语言,个人对C语言不熟悉,因此使用自己熟悉的Java来实现。嗯,以后要是机试...
  • GuLu_GuLu_jp
  • GuLu_GuLu_jp
  • 2016年03月09日 11:15
  • 957

根据前序和中序重建二叉树

注意:1、仅根据前序和后序无法构建唯一的二叉树;2、二叉树前序遍历,第一个数字总是树的根节点的值;3、中序遍历中,根节点的值在序列的中间,左子树的值子在根节点的值得左边,右字树的值在根节点的值得右边;...
  • dutsoft
  • dutsoft
  • 2014年05月21日 15:13
  • 937
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:重建二叉树
举报原因:
原因补充:

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