已知前序遍历跟中序遍历,求后序遍历的程序实现
已知前序遍历和中序遍历,求后序遍历的程序实现
已知两种遍历,求第三种遍历是数据结构的常考题, 现在用编程的方式来实现:
已知前序遍历和中序遍历, 求后序遍历.
虽然这个问题我们用手画画就得出答案了,而编程的话反而不知道如何下手. 实际上,我们都会直观地知道关于遍历的问题肯定使用堆栈或者递归的方式完成. 而递归则更好理解.
后续遍历为 左子树-右子树-根. 而中序遍历中, 每个节点的左右子树都分列两端. 所以我们可以以中序遍历为基础来得到后序遍历. 而前序遍历可以提供给我们当下根节点的位置(因为前序遍历优先遍历根节点, 因此从前读到后就是所有的 根.
说的不太清楚, 程序很好理解:
#include<iostream> #include<algorithm> #include<string> using namespace std; string inorder,preorder; int n=-1; void f (int i,int j) { if(i>j) return; n++; int k; for( k=i;k<=j;k++) { if(inorder[k]==preorder[n]) break; } f(i,k-1); f(k+1,j); cout<<inorder[k]; } int main() { cin>>preorder>>inorder; f(0,preorder.length()-1); }n 从前序序列中从前往后走,第一个点是根节点, 所以根据这个点将中序序列分成两半,然后最后打印这个点(后序遍历).
在每一次递归中, 每个递归的根节点都是按递归的先后顺序出现在前序序列中的