中序遍历和后序遍历树构造二叉树

来源:互联网 发布:西安交通大学网络缴费 编辑:程序博客网 时间:2024/06/05 08:48
#include <iostream>#include <vector>using namespace std;//Definition of TreeNode :class TreeNode {public:int val;TreeNode *left, *right;TreeNode(int val) {this->val = val;this->left = this->right = NULL;}};class Solution {/***@param inorder : A list of integers that inorder traversal of a tree*@param postorder : A list of integers that postorder traversal of a tree*@return : Root of a tree*/public:TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {// write your code hereif (inorder.size()<1 || postorder.size()<1){return NULL;}return ConstructTree(inorder, postorder);}TreeNode* ConstructTree(vector<int>&inorder, vector<int>&postorder){int len1 = inorder.size();int len2 = postorder.size();if (len1<1 || len2<1){return NULL;}TreeNode* root = new TreeNode(postorder[len2 - 1]);//后续遍历的最后一个元素为跟结点if (1 == len1 || 1 == len2){return root;}vector<int> linorder;vector<int> rinorder;vector<int> lpostorder;vector<int> rpostorder;int index = 0;int i = 0;for (i = 0; i < len1;i++){if (inorder[i] == postorder[len2-1]){index = i;break;}}for (i = 0; i < index;i++){linorder.push_back(inorder[i]);}for (i = index + 1; i < len1;i++){rinorder.push_back(inorder[i]);}for (i = 0; i < index;i++){lpostorder.push_back(postorder[i]);}for (i = index; i < len2 - 1;i++){rpostorder.push_back(postorder[i]);}root->left = ConstructTree(linorder, lpostorder);root->right = ConstructTree(rinorder, rpostorder);return root;}void Out(TreeNode* head){if (NULL != head){cout << head->val << " ";Out(head->left);Out(head->right);}}};int main(){TreeNode* head = NULL;Solution s;int in[] = { 4, 7, 2, 1, 5, 3, 8, 6 };int pos[] = { 7, 4, 2, 5, 8, 6, 3, 1 };int len = sizeof(in) / sizeof(in[0]);vector<int >inorder(in, in + len);vector<int>postorder(pos, pos + len);head = s.buildTree(inorder, postorder);s.Out(head);return 0;}

1 0