前序+中序 /前序+后序/中序+后序重建二叉树
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 */
相关文章推荐
- 已知二叉树的前序和中序,重建二叉树_笔记
- 根据前序和中序重建二叉树的代码,出了错误 请指教
- 重建二叉树,输入某二叉树的前序遍历和中序遍历的结果,重建出二叉树,假设输入的前序和中序遍历结果中不含重复的数字
- Construct Binary Tree from Preorder and Inorder Traversal 前序和中序重建二叉树
- 剑指offer刷题之c++实现的根据二叉树的前序和中序遍历重建二叉树
- C++根据前序和中序重建二叉树
- 根据前序和中序遍历重建二叉树
- 前序和中序重建二叉树, 树的前序递归,中序递归,后序递归遍历和前序非递归,中序非递归,后序非递归遍历
- POJ 2255 根据二叉树的前序和中序序列来重建二叉树
- 前序和中序重建二叉树
- 根据二叉树 前序和中序 重建原二叉树
- 重建二叉树,给出一个二叉树的前序和中序遍历,恢复二叉树的结构
- 【面试题】剑指Offer-6-根据前序和中序遍历重建二叉树
- 根据前序和中序重建二叉树
- [面试] 根据前序和中序重建二叉树,并且中序非递归遍历
- 根据二叉树的前序和中序序列来重建二叉树
- [面试] 根据前序和中序重建二叉树,并且中序非递归遍历
- Python练手之根据前序和中序&根据中序和后序重建二叉树,输出前序、中序和后序遍历结果
- 根据前序和中序重建二叉树
- 【面试算法系列】已知二叉树的前序和中序遍历重建二叉树 - C语言实现