重建二叉树

对于一颗二叉树,可以根据先序遍历(后序遍历)和中序遍历重新还原出二叉树。比如前序遍历为{1,2,4,7,3,5,6,8},中序遍历为{4, 7, 2, 1,5,3,8,6}。

根据先序遍历和中序遍历还原二叉树的主要思想:

1、先序遍历序列的第一个元素必定是根节点,可以由此获取二叉树的根节点。

2、根据根节点,在中序遍历序列中查找该节点,由中序遍历的性质可知,中序遍历中该根节点左边的序列必定在根节点的左子树中,而根节点右边的序列必定在右子树中。由此可以知道先序遍历中左子树以及右子树的起止位置。

3、分别对左子树和右子树重复上述的过程,直至所有的子树的起止位置相等时,说明已经到达叶子节点,遍历完毕。


代码如下:

#include <iostream>
using namespace std;

typedef struct node{
	int data;
	node* left;
	node* right;
}*nodePtr;

void ReBuild(int *preStart, int *preEnd, int *inStart, int *inEnd, nodePtr &rootPtr)
{
	if (preStart > preEnd || inStart > inEnd || !preStart || !inStart)
		return;
	else
	{
		int rootVal = *preStart;
		int *rootIndex = find(inStart, inEnd, rootVal);
		rootPtr = new node;
		rootPtr->data = rootVal;
		rootPtr->left = NULL;
		rootPtr->right = NULL;
		if (rootIndex != inEnd + 1)
		{
			int leftLen = rootIndex - inStart;
			ReBuild(preStart + 1, preStart + leftLen, inStart, rootIndex - 1, rootPtr->left);
			ReBuild(preStart + leftLen + 1, preEnd, rootIndex + 1, inEnd,  rootPtr->right);
		}
	}
}

void InTraverse(nodePtr &a)
{
	if (a != NULL)
	{
		InTraverse(a->left);
		cout << a->data << endl;
		InTraverse(a->right);
	}
}


int main()
{
	int pre[] = { 1, 2, 4, 7, 3, 5, 6, 8};
	int in[] = { 4, 7, 2, 1, 5, 3, 8, 6 };
	nodePtr rootPtr = NULL;
	ReBuild(pre, pre + 7, in, in + 7, rootPtr);
	InTraverse(rootPtr);
	system("pause");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值