1、树中结点的查找操作
查找的方式
-基于数据元素值的查找
GTreeNode<T>* find(const T& value) const
-基于结点的查找
GTreeNode< T>* find( TreeNode< T>* node) const树中数据元素和结点的查找
递归的思想
基于数据元素值的查找
- 定义功能: find(node, value)
在node为根结点的树中查找value所在的结点
基于结点的查找
- 定义功能: find(node, obj)
在node为根结点的树中查找是否存在obj结点
2、编程实验
基于数据元素值的查找
基于结点的查找
#ifndef GTREE_H #define GTREE_H #include "Tree.h" #include"GTreeNode.h" namespace DTLib { template < typename T > class GTree : public Tree<T> { protected: GTreeNode<T>* find(GTreeNode<T>* node,const T& value) const { GTreeNode<T>* ret = NULL; if(node != NULL) { if(node->value == value) { return node; } else { for(node->child.move(0);!node->child.end() && (ret == NULL);node->child.next()) //在node子树中查找 { ret = find(node->child.current(),value); //child里数据元素类型是GTreeNode<T>* } } } return ret; } GTreeNode<T>* find(GTreeNode<T>* node,GTreeNode<T>* obj) const { GTreeNode<T>* ret = NULL; if(node == obj) { return node; } else { if(node != NULL) { for(node->child.move(0);!node->child.end() && (ret == NULL);node->child.next()) { ret = find(node->child.current(),obj); } } } return ret; } public: bool insert(TreeNode<T>* node) { bool ret = true; return ret; } bool insert(const T& value,TreeNode<T>* parent) { bool ret = true; return ret; } SharedPointer< Tree<T> > remove(const T& value) { return NULL; } SharedPointer< Tree<T> > remove(TreeNode<T>* node) { return NULL; } GTreeNode<T>* find(const T& value) const //GTreeNode 赋值兼容原则 { return find(root(),value); } GTreeNode<T>* find(TreeNode<T>* node) const { return find(root(),dynamic_cast< GTreeNode<T>* >(node)); } GTreeNode<T>* root() const { return dynamic_cast< GTreeNode<T>* >(this->m_root); } int degree() const { return 0; } int count() const { return 0; } int height() const { return 0; } void clear() { this->m_root = NULL; } ~GTree() { clear(); } }; } #endif // GTREE_H
main.cpp
#include <iostream> #include"GTree.h" using namespace std; using namespace DTLib; int main() { GTree<int> t; GTreeNode<int> tn; t.find(0); t.find(&tn); return 0; }
3、小结
查找操作是树的关键操作之—
基于数据元素的查找可判断值是否存在于树中
基于结点的查找可判断树中是否存在指定结点
插入操作和删除操作都依赖于查找操作4、实战预告
To be continued ...
思考:
如何实现GTree (通用树结构)的结点插入操作?