根据一棵树的中序遍历与后序遍历构造二叉树。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
3
/
9 20
/
15 7
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
TreeNode *preOrder(int leftIn, int rightIn, int leftPost, int rightPost,
vector<int> &inorder, vector<int> &postorder)
{
if(leftIn > rightIn || leftPost > rightPost) return NULL;
int rootIn = 0;
while(rootIn <= rightIn && inorder[rootIn] != postorder[rightPost]) rootIn++;
int leftNum = rootIn - leftIn;
TreeNode *root = new TreeNode (inorder[rootIn]);
root->left = preOrder(leftIn, rootIn-1, leftPost, leftPost+leftNum-1, inorder, postorder);
root->right = preOrder(rootIn+1, rightIn, leftPost+leftNum, rightPost-1, inorder, postorder);
return root;
}
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if(inorder.size() == 0 && postorder.size() == 0) return NULL;
return preOrder(0, inorder.size()-1, 0, postorder.size()-1, inorder, postorder);
}
};
此题与上一题类似,也是先找出根节点,再求出左子树的数目,递归前序遍历构造二叉树