您的位置:首页 > 其它

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

2013-09-04 10:50 225 查看
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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: