卡特兰数--前序遍历对应的二叉树/进栈顺序对应的出栈顺序
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的后续元素再进行进栈操作。
分析:根据前序遍历得到对应所有二叉树的中序遍历,类似于给出一个进栈顺序,输出所有的出栈顺序。可以使用一个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); }
相关文章推荐
- 简单二叉树的构造,前序遍历顺序为;中序遍历顺序为;后序遍历顺序为;
- 二叉树的前序遍历
- 二叉树的前序遍历、中序遍历和后序遍历及其算法
- 二叉树的前序遍历
- Java二叉树(二)--根据前序和中序遍历求后序遍历
- 二叉树的前序遍历
- 非递归前序遍历二叉树-代码实例讲解
- LeetCode 根据前序和中序遍历构造二叉树的三种解法
- 已知二叉树的前序遍历,中序遍历,求后序遍历的问题。
- 二叉树的前序遍历三种方法
- 面试题 二叉树的前序遍历,中序遍历,后序遍历(递归实现)
- 顺序二叉树的建立、前中后序遍历。
- 输入某二叉树的前序和中序遍历结果,重建该二叉树
- 二叉树的前序遍历的非递归算法(二)
- 前序遍历二叉树
- 出栈顺序 与 卡特兰数(Catalan)的关系
- LintCode_066_二叉树的前序遍历
- 重建二叉树(根据前序和中序遍历结果)
- 数据结构--二叉树--节点的修改(顺序结构,包括二叉树的顺序遍历和打印)
- 数据结构--二叉树--中序递归遍历二叉树(顺序结构)