一颗二叉树:
前序遍历结果: abdcef
中序遍历结果:dbaecf
基于递归的思想:在前序遍历中的第一个结点是根结点,然后在中序遍历中找到此根节点,然后递归的对左右子树分别重建。
顺说一下,知道前序和后序遍历结果,我无法重建二叉树的,因为当某个结点只有一个儿子结点的时候,无法区分出到底是左还是右结点。
#include <iostream> #include <cstring> using namespace std; struct Binode { char data; Binode *lhs; Binode *rhs; }; void Rebuild_tree(char *preorder,char *inorder,int len,Binode *& root) { if(preorder==NULL || inorder==NULL) return ;// 检查边界条件 root=new Binode; root->data=preorder[0]; //前序遍历的第一个结点作为根结点。 root->lhs=root->rhs=NULL; if(len==1) return ; //当前树的长度为1,那么已经是最后一个结点。 int leftlen=0; char *pleftend=inorder; while(*preorder!=*pleftend) { if(preorder==NULL || pleftend==NULL) return ; pleftend++; } leftlen=(int)(pleftend-inorder); //左子树长度 int rightlen=len-leftlen-1; //右子树长度 //重建左子树 if(leftlen>0) { Rebuild_tree(preorder+1,inorder,leftlen,root->lhs); } //重建右子树 if(rightlen>0) { Rebuild_tree(preorder+leftlen+1,pleftend+1,rightlen,root->rhs); } } void Post_Traversal(Binode *root) { if(root->lhs) Post_Traversal(root->lhs); if(root->rhs) Post_Traversal(root->rhs); cout<<root->data<<" "; } int main() { char *preorder="abdcef"; char *inorder="dbaecf"; int len=strlen(inorder); Binode *root; Rebuild_tree(preorder,inorder,len,root); Post_Traversal(root); return 0; }