重建二叉树

《编程之美》第3.9节:重建二叉树

问题:已知二叉树的先序和中序遍历,重构二叉树

解法:通过先序遍历,不断抽取子树的根节点进行重构。

代码:

#include<iostream>
using namespace std;

struct Node
{
	Node *left;
	Node *right;
	char value;
	Node(char v,Node *l=nullptr,Node *r=nullptr):value(v),left(l),right(r){}
};
int i=0;

Node *rebuildTree(char *pPreOrder,char *pInOrder,int nTreeLen)
{
	if(nTreeLen<=0)//这一句判断不能少!!!因为每次都相当于把pPreOrder长度缩短了,
				   //但是相应的pInOrder长度并非和pPreOrder长度相同,是通过nTreeLen使两者强制相等的,因此一定要保证nTreeLen>0
				   //如果nTreeLen<=0,说明此时递归应该结束了
		return nullptr;
	Node *root=new Node(*pPreOrder);
	cout<<++i<<endl;
	if(nTreeLen==1)
		return root;
	char first=*pPreOrder;
	int i=0;
	while(pInOrder[i]!=first)
		i++;
	root->left=rebuildTree(pPreOrder+1,pInOrder,i);
	root->right=rebuildTree(pPreOrder+i+1,pInOrder+i+1,nTreeLen-i-1);
	return root;
}

int main()
{
	char *pPreOrder="abdcef";
	char *pInOrder="dbaecf";
	Node *result=rebuildTree(pPreOrder,pInOrder,6);

	system("pause");
	return 0;
}
一定要注意nTreeLen<=0的情况,要直接返回!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值