根据前序和中序构造二叉树(变成之美P246)

#include "stdafx.h"
#include <iostream>
#include <cassert>
using namespace std;


struct Node
{
	char element;
	Node *left;
	Node *right;
	Node(char ele = '0', Node *pLeft = NULL, Node *pRight = NULL)
		:element(ele), left(pLeft), right(pRight){}
};
/*
	函数功能:根据前序preStr和中序midStr重构二叉树
	参数:preStr为前序,midStr为中序,len为每次划分后左子树元素的个数
*/
Node* RebuildTree(char *preStr, char *midStr, int len)
{
	assert(preStr && midStr);
	
	if(len <= 0)
		return NULL;
	//构造根
	Node *root = new Node(*preStr);
	
	//根据根对中序进行划分
	char *pos = midStr;
	for( ; pos  < midStr + len; pos++)
		if(*pos == *preStr)
			break;
	
	//左子树元素个数
	int k = pos - midStr;
	
	//递归构造左右子树
	root->left = RebuildTree(preStr + 1, midStr, k);
	root->right = RebuildTree(preStr + k + 1, pos + 1, len - k - 1);

	return root;
}
/*
	函数功能:后序输出二叉树
*/
void PostPrint(Node *root)
{
	if(NULL == root)
		return ;

	PostPrint(root->left);
	PostPrint(root->right);
	printf("%c ", root->element);
}


int main()
{
	char *pre = "abdcef";
	char *mid = "dbaecf";

	Node *root = RebuildTree(pre, mid, strlen(mid));

	PostPrint(root);
	cout<<endl;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值