天天看点

二叉树--由前序遍历和中序遍历重建二叉树

由前序遍历和中序遍历重建二叉树(前序序列:1 2 3 4 5 6 - 中序序列:3 2 4 1 6 5)

思路:

前序遍历第一个是根节点。

中序遍历根节点左侧为左子树,根右侧为右子树。

那么先构造根节点,根节点左侧都为左子树,根右侧都为右子树。

然后对左右子树递归式的构造即可。

//封装
BinaryTreeNode* Construct(int * preorder, int* inorder,int length)
{
     if(preorder == NULL || inorder == NULL || length <= )
          return NULL;
     return ConstructCore(perorder, preorder+length-,inorder,inorder+length-);
}

//找根并递归构建
BinaryTreeNode* ConstructCore(int* startPreorder,int* endPreorder,int* startInorder,int* endInorder)
{
     int rootValue = startPreorder[];
     BinaryTreeNode* Root = new BinaryTreeNode();
     Root -> value = rootvalue;
     Root -> left = Root -> right = NULL;

     if(startPreorder == endPreorder)
     {
          if(startInorder == endInorder && *startPreorder = *startInorder)
               return Root;
          else
               cout<<"error input"<<endl;
               return NULL;
     }

     //中序遍历找根
     int *rootInorder = startInorder;
     while(rootInorder <= endInorder && *rootInorder != rootValue)
          ++rootInorder;

     if(rootInorder > endInorder)
          return NULL;

     int leftLength = rootInorder - startInorder;
     int * leftPreOrderEnd = startPreorder+leftLength;

     //递归构建左右子树
     if(leftLength > )
          Root -> left = ConstructCore(startPreorder+,leftPreOrderEnd,startInorder,rootInorder-);
     if(leftLength < endPreorder - startPreorder)
          Root -> right = ConstructCore(leftPreOrderEnd+,endPreorder,rootInorder+,endInorder-);

      return Root;    
}
           

继续阅读