解題思路
類似於通過前序遍歷和中序遍歷思想
由於後序遍歷的最後一個元素一定是根節點,因此容易獲得根節點,再通過中序遍歷,可以知道左右子樹的位置及個數
對於中序遍歷的左右子樹,再遞歸進行構建
代碼
class Solution {
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
return create(inorder, postorder, 0, inorder.size() - 1, 0, postorder.size() - 1);
}
TreeNode* create(vector<int>& inorder, vector<int>& postorder, int inL,int inR, int postL, int postR)
{
if (postL > postR) return NULL;//遞歸邊界
TreeNode* head = new TreeNode(postorder[postR]);
//求後序遍歷根節點在中序遍歷中的位置
int k;
for (k=inL;k<=inR;k++)
{
if (inorder[k]==postorder[postR])
{
break;
}
}
//右子樹結點的個數
int numsRight = inR - k;
head->left = create(inorder, postorder, inL, k - 1, postL, postR-numsRight-1);
head->right = create(inorder, postorder, k + 1, inR, postR - numsRight, postR - 1);
//返回根節點
return head;
}
};