1,查找的方式(都返回指向結點的指針):
1,基於數據元素值的查找:
1,GTreeNode<T>* find(const T& value) const
1,const 表示當前的成員函數不會修改對象的狀態,也就是成員變量的值;
2,基於結點的查找:
1,GTreeNode<T>* find(TreeNode<T>* node) const
1,和上面的函數在參數上表現為重載關系;
2,樹中數據元素和結點的查找:
1,從樹的定義着手分析這種非線性的查找操作;
3,基於數據元素值的查找:
1,定義功能:find(node, value)
1,在 node 為根結點的樹中查找 value 所在的結點;
2, 功能函數代碼實現:
1 /* 定義一個遞歸實現的基於數據的 find 功能函數第一個參數是作為根結點的 node 的指針, 第二個參數是數據元素的值 */ 2 GTreeNode<T>* find(GTreeNode<T>* node, const T& value) const 3 { 4 GTreeNode<T>* ret = NULL; // 查找不到返回空 5 6 if( node != NULL ) // 根結點 node 是否為空,為空則返回空作為結果 7 { 8 if( node->value == value ) // 根結點 node 是否保存目標數據元素值 9 { 10 return node; // 保存則直接返回 node 11 } 12 else 13 { 14 /* 遍歷當前結點里面的鏈表,鏈表里面保存的每一個數據元素都是一個指向子樹的指針遍歷當前結點中的每一顆子樹,每一顆子樹里面查找數據元素的值 value*/ 15 for(node->child.move(0); !node->child.end()&& (ret == NULL); node->child.next()) // 游標定位下標為 0 處;返回值為空則還沒找到 16 { 17 ret = find(node->child.current(), value); // 開始遞歸,子節點的樹中,查找 value 成員,如果 ret 不為空,循環結束 18 } 19 } 20 } 21 22 return ret; 23 }
3,基於數據元素值查找成員函數代碼實現:
1 /* 基於數據元素值的查找 */ 2 GTreeNode<T>* find(const T& value) const // 返回的子類對象,賦值兼容性原則 3 { 4 return find(root(), value); 5 }
4,基於結點的查找:
1,定義功能:find(node, obj)
1,在 node 為根結點的樹中查找是否存在 obj 結點;
2,功能函數代碼實現:
1 /* 定義一個遞歸實現的基於結點的 find 功能函數 */ 2 GTreeNode<T>* find(GTreeNode<T>* node, GTreeNode<T>* obj) const 3 { 4 GTreeNode<T>* ret = NULL; // 返回值變量 5 if( node == obj ) // 直接比較是否相等 6 { 7 return node; // 返回地址 8 } 9 else 10 { 11 if( node != NULL ) 12 { 13 /* 使用鏈表的方法遍歷子樹,在 node 中遞歸查找是否存在 obj 這個結點 */ 14 for(node->child.move(0); !node->child.end() && (ret == NULL); node->child.next()) 15 { 16 ret = find(node->child.current(), obj); // 子樹當中查找目標結點 17 } 18 } 19 } 20 21 return ret; 22 }
3,基於結點查找成員函數代碼實現:
1 /* 基於結點的查找 */ 2 GTreeNode<T>* find(TreeNode<T>* node) const // 直接傳遞結點地址來調用 3 { 4 return find(root(), dynamic_cast<GTreeNode<T>*>(node)); // 賦值兼容性原則直接轉換指針 5 }
5,小結:
1,查找操作是樹的關鍵操作之一;
2,基於數據元素的查找可判斷值是否存在於樹中;
3,基於結點的查找可判斷樹中是否存在指定結點;
4,插入操作和刪除操作都依賴於查找操作;