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,插入操作和删除操作都依赖于查找操作;