/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * }; */ #include <vector> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param inOrder int整型vector * @param postOrder int整型vector * @return TreeNode类 */ TreeNode* buildTree(vector<int>& inOrder, vector<int>& postOrder) { // write code here // 已知中序遍历后后续遍历,重建二叉树; if(inOrder.empty() || postOrder.empty()) return nullptr; // 从后续遍历的数组中找到根节点 TreeNode* root = new TreeNode(postOrder.back()); int index = 0; for(; index<inOrder.size(); ++index) { if(inOrder[index]==postOrder.back()) break; } cout << index << endl; postOrder.pop_back(); // 如果有节点,则中序遍历和后续遍历的数组都不可能为空,所在index必定在[0,inOrder.size()-1]之间; // 左子树的中序遍历 vector<int> left_inOrder(inOrder.begin(), inOrder.begin()+index); // 右子树的中序遍历 vector<int> right_inOrder(inOrder.begin()+index+1, inOrder.end()); // 根据根节点在中序遍历中的位置,得到左右子树的“长度”,将后续遍历的数组分为左子树和右子树的后续遍历结果; int len = index-0; // 左子树的后续遍历 vector<int> left_postOrder(postOrder.begin(), postOrder.begin()+len); // 右子树的后续遍历 vector<int> right_postOrder(postOrder.begin()+len, postOrder.end()); root->left = buildTree(left_inOrder, left_postOrder); root->right = buildTree(right_inOrder, right_postOrder); return root; } };