樹形結構是一類重要的非線性數據結構,其中樹和二叉樹最為重要,那么如何創建二叉樹.
方法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項目),如果測試失敗,可能是敲入代碼語法錯誤,並不是思路錯誤,可隨時
私信本人進行更改。