从中序和后序遍历构造二叉树
#include<vector>
using namespace std;
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int val_) :val(val_) {}
};
class Solution {
public:
TreeNode* connectNode(vector<int>inorder,int x, int y,vector<int> postorder,
int i, int j)
{
if (x > y || i > j)
return nullptr;
TreeNode* root = new TreeNode(postorder[j]);
for (int k = x; k <= y; ++k)
{
if (inorder[k] == postorder[j])
{
root->left = connectNode(inorder, x, k - 1, postorder, i, i + k - 1 - x);
root->right = connectNode(inorder, k + 1, y, postorder, i + k - x, j-1);
break;
}
}
return root;
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if (inorder.size() == 0 || postorder.size() == 0 || inorder.size() != postorder.size())
{
return nullptr;
}
int inSize = inorder.size();
int postSize = postorder.size();
return connectNode(inorder, 0, inSize - 1, postorder, 0, postSize - 1);
}
};