给定一颗二叉树的前序序列,求所有可能的中序序列
2012-08-07 10:22
239 查看
前两天在复习数据结构二叉树部分的时候,看到当初在书上写的一个问题:怎么能找出和一个前序序列对应的所有可能的中序序列,问题末尾有一个大大的问号,想必当时自己肯定没想明白。今天重新想了一下,这个问题相当于求一个给定入栈序列所有可能的出栈序列,用回溯的方法来做。
算法的基本思想:模拟一系列入栈出栈的过程,对于每一步操作,可能是入栈,也可能是出栈;如果所有元素都已入栈,那就将栈中元素都弹出,这就找到一个中序序列。
代码如下:
算法的基本思想:模拟一系列入栈出栈的过程,对于每一步操作,可能是入栈,也可能是出栈;如果所有元素都已入栈,那就将栈中元素都弹出,这就找到一个中序序列。
代码如下:
/* * root是前序序列,l表示入栈的第几个字符,stack,top不用说了,inTree用来保存当前得到的中序序列 */ void inorderTrees(char *root, int l, char *stack, int top, char *inTree, int k) { if(l == strlen(root)) { int i; for(i = 0; i < k; ++i) printf("%c", inTree[i]); for(i = top - 1; i >= 0; --i) printf("%c", stack[i]); printf("\n"); } else { stack[top] = root[l]; inorderTrees(root, l+1, stack, top+1, inTree, k); if(top > 0) { --top; int temp = stack[top]; inTree[k] = stack[top]; inorderTrees(root, l, stack, top, inTree, k+1); //记得恢复栈顶啊亲~ stack[top] = temp; } } }
int main() { char *tree = "123"; char *s = (char *)malloc(sizeof(char)*(strlen(tree)+1)); char *inTree = (char *)malloc(sizeof(char)*(strlen(tree)+1)); inorderTrees(tree, 0, s, 0, inTree, 0); return 0; }
相关文章推荐
- 给定先序和后续,构造出一颗二叉树并输出中序序列
- 构造二叉树的抽象数据类型对于给定的先序序列和中序序列,构造二叉树,并按层输出所有结点内容,要求每层结点输出一行按层输出上述二叉树所表示的森林的所有结点内容
- 给定二叉树的前序和中序,判断是否可以构成一颗二叉树,如果可以输出后序
- 给定一个入栈序列,求所有可能的出栈序列
- 给定入栈顺序,输出所有可能的出栈情况,并判断给定的序列是否为正确的输出序列
- 给定二叉树的先序遍历和中序遍历,输出它的后序遍历序列
- 陈利人 面试题 给定两个字符串s和t(len(s)>len(t)),t可能是s的一个子序列。求所有s的子序列集合中,有多少个子序列等于t。
- 给定二叉树的前序遍历结果,输出所有可能的中序遍历的结果
- 面试题之括号匹配分析( 出栈序列是否合法,给定一个入栈序列,求所有可能的出栈序列等等)
- 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
- 给定一个入栈序列,求所有可能的出栈序列
- 给定一个入栈序列,求所有可能的出栈序列
- 陈利人 面试题 给定两个字符串s和t(len(s)>len(t)),t可能是s的一个子序列。求所有s的子序列集合中,有多少个子序列等于t。
- 根据给定先序和中序序列来重建二叉树
- 给定入栈序列1到n,输出所有可能的出栈序列
- 已知一颗二叉树S的前序遍历和中序遍历 序列,请编程输出二叉树S的后续遍历序列.
- 已知一颗二叉树S的前序遍历和中序遍历序列,请编程输出二叉树S的后续遍历序列。
- 第十一周项目2 二叉树构造算法--中序序列和后序序列构造二叉树
- 先序序列和中序序列构造二叉树,中序序列和后序序列构造二叉树
- 【leetcode】31. Next Permutation 数字序列的所有组合中比给定串大的下一个最小的串