重建二叉树

题目:输入某二叉树的前序遍历结果和中序遍历结果,请重建出该二叉树。

假设输入的前序遍历结果和中序遍历结果都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出该二叉树,并输出头结点。



代码实现:

#pragma once
#include<iostream>
#include<vector>
using namespace std;
typedef struct BinaryTreeNode
{
	int _value;
	BinaryTreeNode* _left;
	BinaryTreeNode* _right;
	BinaryTreeNode(int x)
		:_value(x)
		,_left(NULL)
		,_right(NULL)
	{}
	BinaryTreeNode()
		:_value(0)
		,_left(NULL)
		,_right(NULL)
	{}
}Node,*pNode;
class BinaryTree
{
public:
	Node* _root;
public:
	BinaryTree()
		:_root(NULL)
	{}
	Node* __CreatBinaryTree__(int* startprevOrder,int* endprevOrder,int* startinOrder,int* endinOrder)
	{
		int rootValue = startprevOrder[0];
		pNode root = new Node();
		root->_value = rootValue;
		root->_left = root->_right = NULL;
		if(startprevOrder == endprevOrder)//当先序序列中只有一个元素时
		{
			if(startinOrder == endinOrder && *startprevOrder == *startinOrder)
				return root;
			return NULL;
		}
		int* rootinOrder = startinOrder;
		while(rootinOrder != endinOrder && *rootinOrder != rootValue)
		{++rootinOrder;}
		//(1)中序序列出错,导致没有找到rootinOrder;
		//(2)找到了这个rootinOrder;
		int leftlength = rootinOrder - startinOrder;//根节点内左子树的节点数目;
		int* leftprevOrderEnd = startprevOrder + leftlength;//前序序列的左子树节点的范围
		if(leftlength > 0)
		{
			root->_left = __CreatBinaryTree__(startprevOrder+1,leftprevOrderEnd,startinOrder,rootinOrder-1);
		}
		if(leftlength < endprevOrder-startprevOrder)
		{
			root->_right = __CreatBinaryTree__(leftprevOrderEnd+1,endprevOrder,rootinOrder+1,endinOrder);
		}
		return root;
	}
	//采用递归的方式,根据树的先序遍历序列和中序遍历序列来重建二叉树
	Node* CreatBinaryTree(int prevOrder[],int inOrder[],int length)
	{
		if(prevOrder == NULL || inOrder == NULL ||length <= 0)
			return NULL;
		return __CreatBinaryTree__(prevOrder,prevOrder+length-1,inOrder,inOrder+length-1);
	}    
};


void TestBinaryTree()
{
	BinaryTree bt;
	int prevOrder[] = {1,2,4,7,3,5,6,8};
	int inOrder[] = {4,7,2,1,5,3,8,6};
	int length = sizeof(prevOrder)/sizeof(prevOrder[0]);
	bt._root  = bt.CreatBinaryTree(prevOrder,inOrder,length);
	cout<<"bt._root->_value:"<<bt._root->_value<<endl;
}


作者水平有限,如有问题,请留言,谢谢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值