#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;
}
根据前序和中序构造二叉树(变成之美P246)
最新推荐文章于 2023-10-04 07:13:20 发布