//已知先序中序 #include <iostream> #include <string> using namespace std; struct Node{ char data; Node *left; Node *right; }; Node *search(char *pre,char *in,int length) { if (length==0) return NULL; else { Node *node=new Node; node->data=*pre; //根结点 int index; for(index=0;index<length;index++) { if(in[index]==*pre) break; //在中序中定位根结点 } node->left=search(in,pre+1,index); //在先序中左子树的根节点是pre的下一个即为pre+1 //把中序中根结点左侧的部分当作左子树的先序遍历 //index计数出左树的length node->right=search(in+index+1,pre+index+1,length-(index+1)); //右树的length为总length减去(index+1根结点) cout<<node->data<<endl; return node; }} int main() { char *pre="EBADCFHGIKJ"; char *in="ABCDEFGHIJ"; search(pre,in,10); return 0; }
以上程序是可行的
已已知先序和中序为例,先通过先序求得根结点,再在中序中定位根结点,得知左右子树,进而能够在先序中分开左右子树。
后序加中序同理。
核心步骤我认为是找到根结点后定位的这一步,是把整棵树化解开来的基础。
原文:https://www.cnblogs.com/loglian/p/12909984.html