递归的思路就是通过从后向前查找postorder来获取每个子树的根节点,找到根节点后去inorder中找到对应的值,用这个值把inorder分成两半,得到左右子树的大小,用得到的左右子树的大小再去分割postorder,不断分割,构造子树
官方社区有一份代码用压栈的方式实现递归,非常简洁,思路清晰
class Solution {
public:
TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
if(inorder.size() == 0)return NULL;
TreeNode *p;
TreeNode *root;
stack<TreeNode *> stn;
root = new TreeNode(postorder.back());
stn.push(root);
postorder.pop_back();
while(true)
{
if(inorder.back() == stn.top()->val)
{
p = stn.top();
stn.pop(); //一颗子树构造完成,把子树的根节点pop出来
inorder.pop_back();
if(inorder.size() == 0) break;
if(stn.size() && inorder.back() == stn.top()->val)
continue;//stn.top是子树的根节点,continue返回,构造子树
p->left = new TreeNode(postorder.back());
postorder.pop_back();
stn.push(p->left);
}
else
{
p = new TreeNode(postorder.back());
postorder.pop_back();
stn.top()->right = p;
stn.push(p); //用栈实现dfs,只不过dfs是从右下位置开始的
}
}
return root;
}
};