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

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 s, vector seq){
	//所有元素已经全部进过栈
	if (index == n){
		//打印已出栈序列元素
		vector::iterator seqBegin = seq.begin();
		vector::iterator seqEnd = seq.end();
		while (seqBegin < seqEnd){
			cout<<*seqBegin<<" ";
			seqBegin++;
		}
		//打印栈中尚未出栈的元素,此时按照待出栈顺序,从后向前打印
		vector::reverse_iterator sBegin = s.rbegin();
		vector::reverse_iterator sEnd = s.rend();
		while (sBegin < sEnd){
			cout<<*sBegin<<" ";
			sBegin++;
		}
		cout< s;		//用来模拟进出栈
	vector seq;	//存放已出栈的序列
	AllBinaryTreeCore(preOrder, 0, n, s, seq);
}

你可能感兴趣的:(二叉树)