- 查找的方式
— 基于数据元素值的查找:GTreeNode<T>* find(const T& value) const
— 基于结点的查找:GTreeNode<T>* find(TreeNode<T>* node) const
1、基于数据元素值的查找:在 protected 属性中定义 find(node, value) 功能,在 node 为根结点的树中查找 value 所在的结点
2、基于结点的查找:在 protected 属性中定义 find(node, obj) 功能,在 node 为根结点的树中查找是否存在 obj 结点
GTreeNode.h
#ifndef GTREENODE_H
#define GTREENODE_H
#include "LinkList.h"
#include "TreeNode.h"
namespace XiebsLib
{
template <typename T>
class GTreeNode : public TreeNode<T>
{
public:
LinkList<GTreeNode<T>*> child;
};
}
#endif // GTREENODE_H
GTree.h
#ifndef GTREE_H
#define GTREE_H
#include "GTreeNode.h"
#include "Tree.h"
namespace XiebsLib
{
template <typename T>
class GTree : public Tree<T>
{
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
{
for(node->child.move(0); (!node->child.end() && ret == nullptr); node->child.next())
{
ret = find(node->child.current(), obj);
}
}
return ret;
}
public:
GTreeNode<T>* find(TreeNode<T>* node)const
{
return find(root(), dynamic_cast<GTreeNode<T>*>(node));
}
GTreeNode<T>* find(const T& value)const
{
return find(root(), value);
}
GTreeNode<T>* root()const
{
return dynamic_cast<GTreeNode<T>*>(this->m_root);
}
};
}
#endif // GTREE_H
#include <iostream>
#include "GTree.h"
using namespace std;
using namespace XiebsLib;
int main()
{
GTree<int> t;
GTreeNode<int> tn;
t.find(0);
t.find(&tn);
return 0;
}
- 小结:
1、查找操作是树的关键操作之一
2、基于数据元素的查找课判断值是否存在于树中
3、基于结点的查找可判断树中是否存在指定节点
4、插入操作和删除操作都依赖于查找操作