查找方式
基于数据元素值的查找
- GTreeNode<T> *find(const T &value) const;
基于结点的查找
- GTreeNode<T> *find(TreeNode<T> *node) const;
树中数据元素和结点的查找
基于数据元素值的查找
定义功能: find(node, value)
- 在 node 为根结点的树中查找 value 所在的结点
编程实验:基于数据元素值的查找
基于结点的查找
定义结点功能:find(node, obj)
- 在 node 为根结点的树中查找是否存在 obj 结点
编程实验:基于结点的查找
文件:GTree.h
#ifndef GTREE_H
#define GTREE_H
#include "Tree.h"
#include "GTreeNode.h"
namespace DTLib
{
template <typename T>
class GTree : public Tree<T>
{
public:
bool insert(TreeNode<T> *node) override
{
bool ret = true;
return ret;
}
bool insert(const T &value, TreeNode<T> *parent) override
{
bool ret = true;
return ret;
}
SharedPointer<Tree<T>> remove(const T &value) override
{
return nullptr;
}
SharedPointer<Tree<T>> remove(TreeNode<T> *node) override
{
return nullptr;
}
GTreeNode<T>* find(const T &value) const override
{
return find(root(), value);
}
GTreeNode<T>* find(TreeNode<T> *node) const override
{
return find(root(), dynamic_cast<GTreeNode<T>*>(node));
}
GTreeNode<T>* root() const override
{
return dynamic_cast<GTreeNode<T>*>(this->m_root);
}
int degree() const override
{
return 0;
}
int count() const override
{
return 0;
}
int height() const override
{
return 0;
}
void clear() override
{
this->m_root = nullptr;
}
~GTree()
{
clear();
}
protected:
GTreeNode<T> *find(GTreeNode<T>* node, const T &value) const
{
GTreeNode<T> *ret = nullptr;
if (node != nullptr)
{
if (node->value == value)
{
return node;
}
else
{
for (node->child.move(0); !node->child.end() && (ret == nullptr); node->child.next())
{
ret = find(node->child.current(), value);
}
}
}
return ret;
}
GTreeNode<T> *find(GTreeNode<T>* node, GTreeNode<T> *obj) const
{
GTreeNode<T> *ret = nullptr;
if (node == obj)
{
return node;
}
else
{
if (node != nullptr)
{
for (node->child.move(0); !node->child.end() && (ret == nullptr); node->child.next())
{
ret = find(node->child.current(), obj);
}
}
}
return ret;
}
};
}
#endif // GTREE_H
小结
- 查找操作是树的关键操作之一
- 基于数据元素的查找可判断值是否存在于树中
- 基于结点的查找可判断数中是否存在指定结点
- 插入操作和删除操作都依赖于查找操作
To be continued
思考:如何实现 GTree (通用树结构) 的结点插入操作
bool insert(TreeNode<T> *node) override
{
bool ret = true;
// ...
return ret;
}
bool insert(const T &value, TreeNode<T> *parent) override
{
bool ret = true;
// ...
return ret;
}
以上内容整理于狄泰软件学院系列课程,请大家保护原创!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。