给定一颗二叉树的前序序列,求所有可能的中序序列
前两天在复习数据结构二叉树部分的时候,看到当初在书上写的一个问题:怎么能找出和一个前序序列对应的所有可能的中序序列,问题末尾有一个大大的问号,想必当时自己肯定没想明白。今天重新想了一下,这个问题相当于求一个给定入栈序列所有可能的出栈序列,用回溯的方法来做。
算法的基本思想:模拟一系列入栈出栈的过程,对于每一步操作,可能是入栈,也可能是出栈;如果所有元素都已入栈,那就将栈中元素都弹出,这就找到一个中序序列。
代码如下:
/*
* 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; }

浙公网安备 33010602011771号