二叉树的重构是十分重要的我们必须要把握(并且能够理解它的过程)
一般题目会告诉你,中序遍历和后序遍历去重构二叉树,或者 先序遍历和中序遍历去重构二叉树。
中序遍历和后序遍历去重构二叉树
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
using namespace std;
typedef struct BinaryTree
{
struct BinaryTree *left,*right;
char data;
}BinTreeNode;
BinTreeNode *CreateTree(BinTreeNode *tree,char *PostOrder,char *InOrder,int length)
{
int k=0;
if(length==0) return NULL;
while(PostOrder[length-1]!=InOrder[k]) k++;
if((tree=(BinTreeNode *)malloc(sizeof(BinTreeNode)))==NULL)
{
cout<<"分配内存失败"<<endl;
exit(1);
}
tree->data=InOrder[k];
tree->left=CreateTree(tree->left,PostOrder,InOrder,k);//左子树
tree->right=CreateTree(tree->right,PostOrder+k,InOrder+k+1,length-k-1);//右子树
return tree;
}
void PreOrder(BinTreeNode *tree)
{
if(tree)
{
cout<<tree->data;
PreOrder(tree->left);
PreOrder(tree->right);
}
}
int main()
{
BinTreeNode *tree=NULL;
char PostOrder[50];
char InOrder[50];
int length;//二叉树的结点为多少个
cin>>length;
cin>>PostOrder;//后序
cin>>InOrder;//中序
cout<<"先序遍历是:";
tree=CreateTree(tree,PostOrder,InOrder,length);
PreOrder(tree);
}
中序和先序重构二叉树
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<iostream>
using namespace std;
typedef struct BinaryTree
{
struct BinaryTree *left, *right;
char data;
}BinTreeNode;
BinTreeNode* CreateTree(BinTreeNode* tree, char * PreOrder, char * InOrder, int length)
{
int k = 0;
if (length == 0) return NULL;
while (PreOrder[0] != InOrder[k]) k++;
if ((tree = (BinTreeNode*)malloc(sizeof(BinTreeNode))) == NULL)
{
cout << "内存分配失败" << endl;
exit(1);
}
tree->data=InOrder[k];
tree->left = CreateTree(tree->left, PreOrder + 1, InOrder, k);//左子树
tree->right = CreateTree(tree->right, PreOrder + k + 1, InOrder + k + 1, length - k - 1);//右子树
return tree;
}
void PostOrder(BinTreeNode *tree)
{
if(tree)
{
PostOrder(tree->left);
PostOrder(tree->right);
cout<<tree->data;
}
}
int main()
{
int length;
char PreOrder[50];
char InOrder[50];
BinTreeNode *tree = NULL;
cin >>length;
cin >> PreOrder;//先序
cin>> InOrder;//中序
tree = CreateTree(tree, PreOrder, InOrder, length);
cout<<"后序遍历为";
PostOrder(tree);
return 0;
}