二叉樹--由前序遍歷和中序遍歷重建二叉樹

由前序遍歷和中序遍歷重建二叉樹(前序序列: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 <= 0)
          return NULL;
     return ConstructCore(perorder, preorder+length-1,inorder,inorder+length-1);
}

//找根並遞歸構建
BinaryTreeNode* ConstructCore(int* startPreorder,int* endPreorder,int* startInorder,int* endInorder)
{
     int rootValue = startPreorder[0];
     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 > 0)
          Root -> left = ConstructCore(startPreorder+1,leftPreOrderEnd,startInorder,rootInorder-1);
     if(leftLength < endPreorder - startPreorder)
          Root -> right = ConstructCore(leftPreOrderEnd+1,endPreorder,rootInorder+1,endInorder-1);

      return Root;    
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章