卡特兰数--前序遍历对应的二叉树/进栈顺序对应的出栈顺序

来源:互联网 发布:优化设计方案 编辑:程序博客网 时间:2024/05/17 08:20

Given preorder of a binary tree, print out all the binary trees

分析:根据前序遍历得到对应所有二叉树的中序遍历,类似于给出一个进栈顺序,输出所有的出栈顺序。可以使用一个vector来模拟进出栈,使用另一个vector来保存所有已出栈的序列。总共的二叉树数目是卡特兰数1/(n+1)C(n)(2n)

对于第i个进栈元素,当前栈中有k个元素,第i个元素可以在栈中弹出j(j=0,1,...n)个元素中后再进栈。之后i的后续元素再进行进栈操作。

void AllBinaryTreeCore(int* preOrder, int index, int n, vector<int> s, vector<int> seq){//所有元素已经全部进过栈if (index == n){//打印已出栈序列元素vector<int>::iterator seqBegin = seq.begin();vector<int>::iterator seqEnd = seq.end();while (seqBegin < seqEnd){cout<<*seqBegin<<" ";seqBegin++;}//打印栈中尚未出栈的元素,此时按照待出栈顺序,从后向前打印vector<int>::reverse_iterator sBegin = s.rbegin();vector<int>::reverse_iterator sEnd = s.rend();while (sBegin < sEnd){cout<<*sBegin<<" ";sBegin++;}cout<<endl;return;}int stackSize = s.size();//栈中出栈i个元素,当前元素进栈,然后在处理后续元素for (int i=0; i<=stackSize; i++){//对于非首次操作,栈顶元素是当前元素,首先将当前元素弹出,然后弹出栈中第i个元素if (i!=0){s.pop_back();seq.push_back(s.back());s.pop_back();}//当前元素在出栈i个元素之后进栈s.push_back(preOrder[index]);//处理后续元素AllBinaryTreeCore(preOrder, index+1, n, s, seq);}//栈和序列恢复初始状态s.pop_back();for (int i=0; i<stackSize; i++){s.push_back(seq.back());seq.pop_back();}}//Given preorder of a binary tree, print out all the binary trees//二叉树的中序遍历和正确的出栈顺序一致,使用一个vector模拟进出栈,一个序列表示当前已出栈的序列void AllBinaryTree(int* preOrder, int n){if (preOrder==NULL || n==0)return;vector<int> s;//用来模拟进出栈vector<int> seq;//存放已出栈的序列AllBinaryTreeCore(preOrder, 0, n, s, seq);}
原创粉丝点击