用先根序列和中根序列創建二叉樹


思路:二叉樹的先根序列和中根序列,用兩個數組preorder和inorder存放,先根序列的第一個元素值preorder[0]應為二叉樹的根上的元素值,在另一個數組中查到此值,設為inorder[k]。此時,數組preorder中從preorder[1]到preorder[k]的序列(長度為k)和數組inorder中從inorder[0]到inorder[k-1](長度為k)的序列,恰好分別是根結點左子樹的先根序列和中根序列;數組preorder中從preorder[k+1]到preorder[n-1]的序列(長度為n-k-1)和數組inorder中從inorder[k+1]到inorder[n-1](長度為n-k-1)的序列,恰好分別是根結點右子樹的先根序列和中根序列。根據上述分析,先創建根結點,在遞歸調用自己兩次來分別創建左右子樹。

時間復雜度:最壞的情況是,每個非葉結點只有左子樹,這是兩個數組之間需要比較n+(n-1)+---+1=O(n2)次。所以,該算法時間代價為O(n2)。

空間復雜度:存放二叉樹的空間O(n)和用於遞歸調用的棧空間(不超過O(n))。

程序代碼:

  int create_BTree(PBinTree pbtree,DataType * preorder,DataType * InOrder,int n)

  {

    int i,k;

    int tag1,tag2;

    if(n == 0)

    {

      *pbtree = NULL;

      return TRUE;

    }

    for(i = 0;i<n;i++)

      if(inorder[i] == preorder[0])

        break;

    if(i == n)

    {

      *pbtree = NULL;      

      return FALSE;      //輸入的先根序列或中根序列有誤,創建失敗

    }

    k = i;

    *pbtree = (PBinTreeNode)malloc(sizeof(struct BinTreeNode));  

    (*pbtree)->info = preorder[0];

    tag1 = create_BTree(&(*pbtree)->llink,preorder+1,inorder,k);   //遞歸調用本算法創建左子樹

    tag2 = create_BTree(&(*pbtree)->rlink,preorder+k+1,inorder+k+1,n-k-1);  //遞歸調用本算法創建右子樹

    if(tag1 == TRUE && tag2 == TRUE)

      return TRUE;

    return FALSE;

  }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM