二叉樹的創建


樹形結構是一類重要的非線性數據結構,其中樹和二叉樹最為重要,那么如何創建二叉樹.
 方法1> 可采用樹的先序遍歷(根左右)的方式創建,從鍵盤輸入樹結構的先序遍歷的value值即可.
    假設1:我們規定如果鍵入“/”為空節點,此時樹的節點結構val為char類型,此時創建的樹結構的所有節點也是char類型.
    假設2:我們規定如果鍵入"9"為空節點,此時樹的節點結構val為int類型,此時創建的樹結構的所有節點也是int類型
假設1為例進行編程:

 typedef struct BiTNode{
    char val;
    BiTNode *left;
    BiTNode *right;
  };
//先序遍歷創建一個樹結構
  bool CreateBiTree(BiTNode * &T)
  {
   char ch;
   std::cout << "Input the value:";
   std::cin >> ch;
   if(ch == '/')
   return true;
   BiTNode *p = new BiTNode();
   if(!p)
   exit(OVERFLOW);
   p->val = ch;
   p->left = p->right = NULL;
   T = p;
     CreateBiTree(T->left);
       CreateBiTree(T->right);
 }
//代碼測試
//先序遍歷打印結果
 bool PreOrderTraverse(BiTNode *T,void (*visit)(char e))
{
  if(T == NULL){
     std::cout << "/" ;
     return ture;  
}
    visit(T->val);
    PreOrderTraverse(T->right,visit);
} 

void print(char e){
    std::cout << e;  
}

main函數調用者可自己編寫。

 

方法一中不難發現如果我們從鍵盤輸入值,必須要設定輸入什么value為空節點。也就是說如果我們要創建value是int的二叉樹,必然從1到9其中有一個設為

空節點,可在上面代碼中更改,創建的二叉樹val有一個數值不能用,顯然是不符合實際情況,但是如何解決這個問題呢,方法二給出了答案。

方法二>如果考慮要創建二叉樹的val為int,double,float類型,則需要創建先序,中序,后序三者中的二個來確定唯一的二叉樹.如果要創建這樣一個二叉樹:

 

           假設1:從中序和后序遍歷構造一個樹,假設中序數組為vector<int> inorder = {9,3,15,20,7},后序數組為vector<int> postorder = {9,15,7,20,3}

   假設1為例進行編程,由於面向對象編程很方便,我們打算用c++語言進行編程

struct TreeNode{
    int val;
    TreeNode *left;
    TreeNode *right;            
}
class SolutionA{
public:
    //從中序和后序遍歷構造二叉樹
    TreeNode *buildTree(vector<int> &inorder,vector<int> &postorder)
{
   return buildTree(inorder,0,inorder.size(),postorder,0,postorder.size());    
}    
private:
//具體實現
TreeNode *buildTree(vector<int> &inorder,int inorderL,int inorderR
    vector<int> &postorder,int postorderL,int postorderR)
{
//斷言判斷,vector為0執行
    if(inorderL >= inorderR)
{
     assert(postorderL >= postorderR);
     return NULL;
}
    if(inorderL + 1 == inorderR){
    assert(postorderL + 1 == postorderR);
   return new TreeNode(inorder[inorderL]);
}
    TreeNode *root = new TreeNode(postorder[postorderR - 1]);
   // 1.找到根節點,在后序遍歷中的最后一個
    int rootPos = find(inorder.begin() + inorderL,inorder.begin() + inorderR,root->val) - inorder.begin();
  assert(inorderL <= rootPos && rootPos < inorderR);

  int lsize = rootPos-inorderL;
  int rsize = rootPos-(rootPos+1);
 
 root->left = buildTree(inorder,inorderL,inorderL+lsize,postorder,
postorderL,postorder+lsize);
 root->right = buildTree(inorder,rootPos+1,inorderR,postorder,
postorderL+lsize,postorderR-1);

return root;
}
};
    

main函數調用者可自己編寫。這樣就能創建一個唯一的二叉樹了。

上面代碼在本人的機器上編譯通過,本人的開發環境是(win10 + vs2013 win32項目),如果測試失敗,可能是敲入代碼語法錯誤,並不是思路錯誤,可隨時

私信本人進行更改。

    

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  


免責聲明!

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



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