您的位置:首页 > 其它

前序+中序 /前序+后序/中序+后序重建二叉树

2018-03-16 21:17 239 查看
#include<iostream>
using namespace std;

template <typename T>
struct BinaryNode{
T elem;
BinaryNode *left;
BinaryNode * right;
BinaryNode(T d, BinaryNode *l=NULL, BinaryNode *r=NULL):elem(d),left(l),right(r){};
};

BinaryNode<char>* rebuildTree1(const string &preorder, const string &inorder)
{
if(preorder.empty())return NULL;
char root=preorder[0];

BinaryNode<char> *tree=new BinaryNode<char>(root);

size_t index=inorder.find(root);
string left_preorder,left_inorder,right_preorder,right_inorder;

left_preorder=preorder.substr(1,index);
left_inorder=inorder.substr(0,index);

right_preorder=preorder.substr(index+1,preorder.size()-1);
right_inorder=inorder.substr(index+1,inorder.size()-1);

tree->left=rebuildTree1(left_preorder,left_inorder);
tree->right=rebuildTree1(right_preorder,right_inorder);

return tree;
}

BinaryNode<char>* rebuildTree2(string &inorder , string &postorder)
{
if(postorder.empty()||inorder.empty())return NULL;
size_t last=postorder.size()-1;
char root=postorder[last];
cout<<"root:"<<root<<endl;

BinaryNode<char> *tree=new BinaryNode<char>(root);

size_t index=inorder.find(root);

string left_inorder,right_inorder,left_postorder,right_postorder;

left_inorder=inorder.substr(0,index);
right_inorder=inorder.substr(index+1,inorder.size()-1);

left_postorder=postorder.substr(0,index);
right_postorder=postorder.substr(index,postorder.size()-1-index);

tree->left=rebuildTree2(left_inorder,left_postorder);
tree->right=rebuildTree2(right_inorder,right_postorder);

return tree;

}

BinaryNode<char>* rebuildTree3(string &preorder , string &posorder)
{
if(preorder.empty()||posorder.empty())return NULL;
char root=preorder[0];
BinaryNode<char>* tree=new BinaryNode<char>(root);

char lastpre=preorder[preorder.size()-1];
size_t index=posorder.find(lastpre);
string left_preorder,right_preorder,left_posorder,right_posorder;

left_preorder=preorder.substr(1,index);
right_preorder=preorder.substr(index+1,preorder.size()-1);

left_posorder=posorder.substr(0,index);
right_posorder=posorder.substr(index,posorder.size()-1-index);

tree->left=rebuildTree3(left_preorder,left_posorder);
tree->right=rebuildTree3(right_preorder,right_posorder);

return tree;
}

int main()
{
string prestr,instr,posstr;
cin>>prestr>>instr>>posstr;

BinaryNode<char> *root3=rebuildTree3(prestr,posstr);
cout<<"pre_pos:"<<endl;
cout<<root3->left->elem<<endl;

cout<<root3->left->left->elem<<endl;
cout<<root3->left->right->elem<<endl;

}
/*
138245
832145
823541
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐