对于包含n个结点的二叉树(树中结点编号从1到n),已知前序和后序遍历序列,我们知道不一定能唯一的恢复这棵树。请计算出满足条件的二叉树的总数。
样例:
前序遍历序列preorder:1 2 后序遍历序列postorder:2 1 一共有2棵满足条件的二叉树: 1 1 / \ 2 2
确定范围的时候好烦啊。
int _count(vector<int>& pre,int preL,int preR,vector<int>& post,int postL,int postR); int countValidTrees(vector<int>& preorder, vector<int>& postorder) { if ( preorder.size()!=postorder.size() ) return 0; return _count(preorder,0,preorder.size()-1,postorder,0,postorder.size()-1); } int _count(vector<int>& pre,int preL,int preR,vector<int>& post,int postL,int postR) { if ( preL > preR ) return 1; if ( pre[preL] != post[postR] ) return 0; if ( preL==preR ) return 1; int cnt=0; int k=preR-preL; for(int left=0;left<=k;left++) { cnt+=_count(pre,preL+1,preL+left,post,postL,postL+left-1) * _count(pre,preL+left+1,preR,post,postL+left,postR-1); } return cnt; }