根据前序 中序 后序 构建二叉树
2017-08-08 09:47
387 查看
//Construct Binary Tree from Inorder and Postorder #include <iostream> #include <vector> using namespace std; struct TreeNode{ int val; TreeNode *left, *right; TreeNode(int data): val(data), left(NULL), right(NULL){ } }; class Solution{ public: //根据中序和后序遍历 构建二叉树 TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder){ return buildTree(inorder, 0, inorder.size() - 1, postorder, 0, postorder.size() - 1); } TreeNode *buildTree(vector<int> &inorder, int iLeft, int iRight, vector<int> &postorder, int pLeft, int pRight) { if(iLeft > iRight || pLeft > pRight){ return NULL; } TreeNode *cur = new TreeNode (postorder[pRight]); int i = 0; for(i = iLeft; i < inorder.size(); ++i){ if(inorder[i] == cur->val){ break; } } cur->left = buildTree(inorder, iLeft, i - 1, postorder, pLeft, pLeft + i - iLeft - 1); cur->right = buildTree(inorder, i + 1, iRight, postorder, pLeft + i - iLeft, pRight - 1); return cur; } //根据前序和中序遍历 构建二叉树 TreeNode *buildTree2(vector<int> &preorder, vector<int> &inorder){ return buildTree2(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1); } TreeNode *buildTree2(vector<int> &preorder, int iLeft, int iRight, vector<int> &inorder, int pLeft, int pRight) { if(iLeft > iRight || pLeft > pRight){ return NULL; } TreeNode *cur = new TreeNode(preorder[iLeft]); int i; //for(i = 0; i < inorder.size(); ++i){ for(i = pLeft; i <= pRight; ++i){ if(inorder[i] == cur->val){ break; } } cur->left = buildTree2(preorder, iLeft + 1, iLeft + i - pLeft , inorder, pLeft , i - 1); cur->right = buildTree2(preorder, iLeft + i - pLeft + 1, iRight, inorder, i + 1, pRight); return cur; } }; //前序遍历输出 void PreorderDisplay(TreeNode *root){ if(root == NULL){ return ; } else { cout << root->val <<" "; PreorderDisplay(root->left); PreorderDisplay(root->right); } } //后序遍历输出 void PostorderDisplay(TreeNode *root){ if(root == NULL){ return ; } else { PostorderDisplay(root->left); PostorderDisplay(root->right); cout << root->val << " "; } } int main(){ Solution s; TreeNode *res, *res1; vector<int> inorder = {11,4,5,13,8,9}; vector<int> preorder = {5,4,11,8,13,9}; vector<int> postorder = {11,4,13,9,8,5}; // res = s.buildTree(inorder, postorder); // PreorderDisplay(res); // cout << endl; cout << 2 << endl; res1 = s.buildTree2(preorder, inorder); cout << 2 << endl; //cout << res1->val << endl; PostorderDisplay(res1); system("pause"); return 0; }
相关文章推荐
- LeetCode: 106_Construct Binary Tree from Inorder and Postorder Traversal | 根据中序和后序遍历构建二叉树 | Medium
- 二叉树系列——根据前序和中序、中序和后序构建二叉树
- 根据前序遍历和中序遍历构建二叉树以及根据中序遍历后序遍历构建二叉树
- 根据先序、中序、后序中的两者还原二叉树——递归函数和Csharp泛型
- 如何根据前序、中序、后序遍历还原二叉树
- 根据先序序列与中序序列构建二叉树
- 树的学习——(递归构建二叉树、递归非递归前序中序后序遍历二叉树、根据前序序列、中序序列构建二叉树)
- 根据二叉树前序遍历和中序遍历的结果,重建出该二叉树并后序遍历之 java代码
- java 二叉树的构建 先序、中序、后序遍历
- 面试题3:根据先序和中序遍历的结果构建二叉树
- 数据结构--java实现二叉树的先序、中序、后序、层次遍历及根据先序中序建立二叉树
- 根据前序和中序创建二叉树及二叉树的前序、中序、后序、层次打印
- 根据二叉树的前序和中序获得后序,后序和中序获得前序
- 根据二叉树的中序和后序遍历,求前序遍历
- 根据前序遍历、中序遍历构建二叉树,并后序遍历输出。
- poj2255 根据任意二叉树的先序遍历和中序遍历求解后序遍历
- 七:重建二叉树(根据先序遍历(或者后序遍历)和中序遍历重建二叉树)
- 旧话重提,根据先序和中序遍历构造二叉树并后序遍历验证之
- (树)根据中序后序构建二叉树
- Java实现二叉树的递归构建及先序、中序、后序、层序遍历(递归和循环)