1,樹是一種資料結構,用來儲存容器,因此它可以用來看做一種容器型別;既可以向容器中插入東西,也可以將容器中的東西倒出來;
2,清除操作的定義:
1,void clear():
1,將樹中的所有結點清除(釋放堆中的結點);
3,樹中資料元素的清除:
1,遞迴清除;
4,清除操作功能的定義:
1,清除 node 為根結點的樹;
2,釋放樹中的每乙個結點;
2,功能函式**實現:
15,清除 clear() 函式**的實現:/*清除 node 樹的根結點 */2
void
free(gtreenode*node)310
11if( node->flag() ) //
是否來自堆空間,有些結點直接在棧上申請了,沒有用 insert() 函式申請
1215
}16 }
16,樹中的結點可能**於不同的儲存空間,如何判斷指標指向的結點物件是堆空間中的結點並釋放?void
clear()
2
1,問題分析:
1,單憑記憶體位址很難準確判斷具體的儲存區域;
2,只有堆空間的記憶體需要主動釋放(delete);
1,堆空間中的記憶體通過 new 來的,可以在 new 乙個物件時,標記乙個物件,依據標記來 delete;
3,清除操作時只要對堆空間中的結點進行釋放;
2,解決方案:工廠模式
1,在 gtreenode 中增加保護成員變數 m_flat;
1,增加標記;
2,將 gtreenode 中的 operator new 過載為保護成員函式;
1,意味著在外部不能用 new 操作符建立堆空間中的結點;
3,提供工廠方法 gtreenode* newnode();
1,newnode() 是公有靜態的,返回堆裡面的乙個結點;
2,在外部可以用它建立堆空間的結點;
3,這就是工廠方法;
4,在工廠方法中 new 新結點並將 m_flag 設定為 true;
3,樹結點的工廠模式示例:
1,也就是禁止外界 new (因為外界 new 不會標記)的同時讓外界或內部用 newnode() 並標記 m_flag;
7,工程模式**實現(具體參見博文「樹——樹的定義與操作」中 15.1 和「樹——通用樹的儲存結構與結點實現」中 7.1的內容):
18,小結:protected: //
從兩個子類中重構而來;減少**冗餘
2bool m_flag; //
結點是否申請自堆空間的標誌,第一步34
void* operator
new(unsigned int size) throw() //
new 不能夠在外部呼叫了,統一路徑,第二步58
9public
:10 t value; //
儲存資料
11 gtreenode* parent; //
每個結點包含指向父結點的指標,向上是線性資料結構(鍊錶)
1213
gtreenode()
1418
19static gtreenode* newnode() //
工廠模式,第三步
2026
return
ret;27}
2829
bool flag() //
堆空間的標誌; 重構而來
30
1,清除操作用於銷毀樹中的每個結點;
2,銷毀結點時需要決定是否釋放對應的記憶體空間;
1,之前的順序結構沒有銷毀結點的考慮是因為它們的結點不是單獨的類,外界不能夠定義;
3,工廠模式可用於「定製」堆空間中的結點;
樹 通用樹的層次遍歷
1,為何及如何按層次遍歷通用樹中的每乙個資料元素?1,通用樹結構是一種容器型別的樹結構,其用來裝資料元素,所以應該提供一種方法來遍歷樹中的每乙個資料結構 2,往下分析 2,當前的事實 1,樹是非線性的資料結構,樹的結點沒有固定的編號方式 1,也就不能像鍊錶一樣統一編號來訪問 3,新的需求 1,為通用...
樹的應用 樹的葉子結點數 樹的深度 樹的拷貝
樹的遍歷.cpp 定義控制台應用程式的入口點。include stdafx.h include 二叉鏈表示法 typedef struct bitnode typedef struct bitnode bitree 先序遍歷 void preoder bitnode root printf d ro...
樹 二叉樹結點的插入
1,需要考慮的問題 1,是否能夠在二叉樹任意結點處插入子結點?1,不能,二叉樹每個結點的成員是相對固定的,只有兩個指向左右後繼結點的指標成員 2,是否需要指定新資料元素 新結點 的插入位置?1,需要 2,插入新結點 或資料元素 作為葉結點孩子,具體插入左邊還是右邊呢?2,二叉樹結點的位置列舉型別 1...