注意:1、仅根据前序和后序无法构建唯一的二叉树;2、二叉树前序遍历,第一个数字总是树的根节点的值;3、中序遍历中,根节点的值在序列的中间,左子树的值子在根节点的值的左边,右字树的值在根节点的值的右边;4、思路:递归
#include <iostream> #include <stdlib.h> using namespace std; struct Node{ int value; Node* left; Node* right; }; Node* ConstructCore(int *startPreorder,int *endPreorder,int *startInorder,int *endInorder){ Node* root=new Node(); root->value=startPreorder[0]; root->left=root->right=NULL; //如果仅有一个节点 if(startPreorder == endPreorder){ if(startInorder == endInorder && *startPreorder == *startInorder){ return root; } else{ cout<<"Invalid input"<<endl; exit(1); } } //在中序遍历中找到根节点的值 int *rootInorder=startInorder; while( rootInorder<=endInorder && *rootInorder!=root->value){ rootInorder++; } if(rootInorder == endInorder && *rootInorder != root->value){ cout<<"Invalid input"<<endl; exit(1); } int leftLength=rootInorder-startInorder; int *leftPreorderEnd=startPreorder+leftLength; //递归调用,构建 if(leftLength>0){ root->left=ConstructCore(startPreorder+1,leftPreorderEnd,startInorder,rootInorder-1); } if(leftLength < endPreorder - startPreorder){ root->right=ConstructCore(leftPreorderEnd+1,endPreorder,rootInorder+1,endInorder); } return root; } //构建函数 Node* Construct(int *preorder,int * inorder,int length){ if( preorder == NULL || inorder == NULL || length<=0){ return NULL; } return ConstructCore(preorder,preorder+length-1,inorder,inorder+length-1); } void pre_order(Node* root){ if(root != NULL){ cout<<root->value<<" "; pre_order(root->left); pre_order(root->right); } } void in_order(Node* root){ if(root != NULL){ in_order(root->left); cout<<root->value<<" "; in_order(root->right); } } void post_order(Node* root){ if(root != NULL){ post_order(root->left); post_order(root->right); cout<<root->value<<" "; } } int main(){ int length=8; int preorder[]={1,2,4,7,3,5,6,8}; int inorder[]={4,7,2,1,5,3,8,6}; Node* treeRoot=Construct(preorder,inorder,length); cout<<"Test pre_order"<<endl; pre_order(treeRoot); cout<<endl<<"Test in_order"<<endl; in_order(treeRoot); cout<<endl<<"Test post_order"<<endl; post_order(treeRoot); } /* Test pre_order 1 2 4 7 3 5 6 8 Test in_order 4 7 2 1 5 3 8 6 Test post_order 7 4 2 5 8 6 3 1 Process returned 0 (0x0) execution time : 0.259 s Press any key to continue. */
原文地址:http://blog.csdn.net/dutsoft/article/details/26476961