标签:val 分析 object 元素 int stream ext str lin
查找的方式:
GTreeNode<T>* find(const T& value) const
GTreeNode<T>* find(TreeNode<T>* node) const
树中数据元素和结点的查找:
基于数据元素值的查找:
在GTree.h中实现基于数据元素值的查找:
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())
{
ret = find(node->child.current(), value);
}
}
}
return ret;
}
public:
GTreeNode<T>* find(const T& value) const
{
return find(root(), value);
}
基于结点的查找:
在GTree.h中实现基于结点的查找:
protected:
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:
GTreeNode<T>* find(TreeNode<T>* node) const
{
return find(root(), dynamic_cast<GTreeNode<T>*>(node));
}
插入的方式:
bool insert(TreeNode<T>* node)
bool insert(const T& value, TreeNode<T>* parent)
问题:
问题分析:
新结点的插入:
插入新结点:
插入数据元素:
在GTree.h中实现插入操作:
public:
bool insert(TreeNode<T>* node)
{
bool ret = true;
if( node != NULL )
{
if( this->m_root == NULL )
{
node->parent = NULL;
this->m_root = node;
}
else
{
GTreeNode<T>* np = find(node->parent);
if( np != NULL )
{
GTreeNode<T>* n = dynamic_cast<GTreeNode<T>*>(node);
if( np->child.find(n) < 0 )
{
np->child.insert(n);
}
}
else
{
THROW_EXCEPTION(InvalidOperationException, "Invalid parent tree node ...");
}
}
}
else
{
THROW_EXCEPTION(InvalidParameterException, "Parameter node cannot be NULL ...");
}
return ret;
}
bool insert(const T& value, TreeNode<T>* parent)
{
bool ret = true;
GTreeNode<T>* node = new GTreeNode<T>();
if( node != NULL )
{
node->value = value;
node->parent = parent;
insert(node);
}
else
{
THROW_EXCEPTION(NoEnoughMemoryException, "No memory to create new tree node ...");
}
return ret;
}
mian.cpp测试这棵树:
#include <iostream>
#include "GTree.h"
using namespace std;
using namespace StLib;
int main()
{
GTree<char> t;
GTreeNode<char>* node = NULL;
t.insert(‘A‘, NULL);
node = t.find(‘A‘);
t.insert(‘B‘, node);
t.insert(‘C‘, node);
t.insert(‘D‘, node);
node = t.find(‘B‘);
t.insert(‘E‘, node);
t.insert(‘F‘, node);
node = t.find(‘E‘);
t.insert(‘K‘, node);
t.insert(‘L‘, node);
node = t.find(‘C‘);
t.insert(‘G‘, node);
node = t.find(‘G‘);
t.insert(‘N‘, node);
node = t.find(‘D‘);
t.insert(‘H‘, node);
t.insert(‘I‘, node);
t.insert(‘J‘, node);
node = t.find(‘H‘);
t.insert(‘M‘, node);
const char* s = "KLFGMIJ";
for(int i=0; i<7; i++)
{
TreeNode<char>* node = t.find(s[i]);
while( node != NULL )
{
cout << node->value << " ";
node = node->parent;
}
cout << endl;
}
return 0;
}
运行结果为:
K E B A
L E B A
F B A
G C A
M H D A
I D A
J D A
清除操作的定义:
树中数据元素的清除:
清除操作功能的定义:
在GTree.h中实现清除操作:
protected:
void free(GTreeNode<T>* node)
{
if( node != NULL )
{
for(node->child.move(0); !node->child.end(); node->child.next())
{
free(node->child.current());
}
delete node;
}
}
public:
void clear()
{
free(root());
this->m_root = NULL;
}
问题:
问题分析
解决方案:工厂模式
树结点的工厂模式示例:
实现树结点的工厂模式(修改GTreeNode.h和GTree.h中的对应代码):
GTreeNode.h
#ifndef GTREENODE_H
#define GTREENODE_H
#include "Tree.h"
#include "LinkList.h"
namespace StLib
{
template <typename T>
class GTreeNode : public TreeNode<T>
{
protected:
bool m_flag;
void* operator new(size_t size) throw()
{
return Object::operator new(size);
}
public:
LinkList<GTreeNode<T>*> child;
GTreeNode()
{
m_flag = false;
}
bool flag()
{
return m_flag;
}
static GTreeNode<T>* NewNode()
{
GTreeNode<T>* ret = new GTreeNode<T>();
if( ret != NULL )
{
ret->m_flag = true;
}
return ret;
}
};
}
#endif // GTREENODE_H
修改GTree.h中的对应代码:
protected:
void free(GTreeNode<T>* node)
{
if( node != NULL )
{
for(node->child.move(0); !node->child.end(); node->child.next())
{
free(node->child.current());
}
if( node->flag() )
{
delete node;
}
}
}
public:
bool insert(const T& value, TreeNode<T>* parent)
{
bool ret = true;
GTreeNode<T>* node = GTreeNode<T>::NewNode();
if( node != NULL )
{
node->value = value;
node->parent = parent;
insert(node);
}
else
{
THROW_EXCEPTION(NoEnoughMemoryException, "No memory to create new tree node ...");
}
return ret;
}
删除的方式:
SharedPointer< Tree<T> > remove(const T& value)
SharedPointer< Tree<T> > remove(TreeNode<T>* node)
删除操作成员函数的设计要点:
树中结点的删除:
实用的设计原则:
删除操作功能的定义:
void remove(GTreeNode<T>* node, GTree<T>*& ret)
删除功能函数的实现:
在GTree.h中实现删除操作:
protected:
void remove(GTreeNode<T>* node, GTree<T>*& ret)
{
ret = new GTree<T>();
if( ret == NULL )
{
THROW_EXCEPTION(NoEnoughMemoryException, "No memory to create new tree ...");
}
else
{
if( root() == node )
{
this->m_root = NULL;
}
else
{
LinkList<GTreeNode<T>*>& child = dynamic_cast<GTreeNode<T>*>(node->parent)->child;
child.remove(child.find(node));
node->parent = NULL;
}
ret->m_root = node;
}
}
public:
SharedPointer< Tree<T> > remove(const T& value)
{
GTree<T>* ret = NULL;
GTreeNode<T>* node = find(value);
if( node == NULL )
{
THROW_EXCEPTION(InvalidParameterException, "Can not find the node via parameter value ...");
}
else
{
remove(node, ret);
}
return ret;
}
SharedPointer< Tree<T> > remove(TreeNode<T>* node)
{
GTree<T>* ret = NULL;
node = find(node);
if( node == NULL )
{
THROW_EXCEPTION(InvalidParameterException, "Parameter node is invalid ...");
}
else
{
remove(dynamic_cast<GTreeNode<T>*>(node), ret);
}
return ret;
}
main.cpp测试
#include <iostream>
#include "GTree.h"
using namespace std;
using namespace StLib;
int main()
{
GTree<char> t;
GTreeNode<char>* node = NULL;
GTreeNode<char> root;
root.value = ‘A‘;
root.parent = NULL;
t.insert(&root);
node = t.find(‘A‘);
t.insert(‘B‘, node);
t.insert(‘C‘, node);
t.insert(‘D‘, node);
node = t.find(‘B‘);
t.insert(‘E‘, node);
t.insert(‘F‘, node);
node = t.find(‘E‘);
t.insert(‘K‘, node);
t.insert(‘L‘, node);
node = t.find(‘C‘);
t.insert(‘G‘, node);
node = t.find(‘G‘);
t.insert(‘N‘, node);
node = t.find(‘D‘);
t.insert(‘H‘, node);
t.insert(‘I‘, node);
t.insert(‘J‘, node);
node = t.find(‘H‘);
t.insert(‘M‘, node);
SharedPointer< Tree<char> > p = t.remove(t.find(‘D‘));
const char* s = "KLFGMIJ";
for(int i=0; i<7; i++)
{
TreeNode<char>* node = p->find(s[i]);
while( node != NULL )
{
cout << node->value << " ";
node = node->parent;
}
cout << endl;
}
return 0;
}
运行结果为:
M H D
I D
J D
最终的GTreeNode.h和GTree.h代码:
GTreeNode.h
#ifndef GTREENODE_H
#define GTREENODE_H
#include "Tree.h"
#include "LinkList.h"
namespace StLib
{
template <typename T>
class GTreeNode : public TreeNode<T>
{
protected:
bool m_flag;
void* operator new(size_t size) throw()
{
return Object::operator new(size);
}
public:
LinkList<GTreeNode<T>*> child;
GTreeNode()
{
m_flag = false;
}
bool flag()
{
return m_flag;
}
static GTreeNode<T>* NewNode()
{
GTreeNode<T>* ret = new GTreeNode<T>();
if( ret != NULL )
{
ret->m_flag = true;
}
return ret;
}
};
}
#endif // GTREENODE_H
GTree.h
#ifndef GTREE_H
#define GTREE_H
#include "Tree.h"
#include "GTreeNode.h"
#include "Exception.h"
namespace StLib
{
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())
{
ret = find(node->child.current(), value);
}
}
}
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;
}
void free(GTreeNode<T>* node)
{
if( node != NULL )
{
for(node->child.move(0); !node->child.end(); node->child.next())
{
free(node->child.current());
}
if( node->flag() )
{
delete node;
}
}
}
void remove(GTreeNode<T>* node, GTree<T>*& ret)
{
ret = new GTree<T>();
if( ret == NULL )
{
THROW_EXCEPTION(NoEnoughMemoryException, "No memory to create new tree ...");
}
else
{
if( root() == node )
{
this->m_root = NULL;
}
else
{
LinkList<GTreeNode<T>*>& child = dynamic_cast<GTreeNode<T>*>(node->parent)->child;
child.remove(child.find(node));
node->parent = NULL;
}
ret->m_root = node;
}
}
public:
bool insert(TreeNode<T>* node)
{
bool ret = true;
if( node != NULL )
{
if( this->m_root == NULL )
{
node->parent = NULL;
this->m_root = node;
}
else
{
GTreeNode<T>* np = find(node->parent);
if( np != NULL )
{
GTreeNode<T>* n = dynamic_cast<GTreeNode<T>*>(node);
if( np->child.find(n) < 0 )
{
np->child.insert(n);
}
}
else
{
THROW_EXCEPTION(InvalidOperationException, "Invalid parent tree node ...");
}
}
}
else
{
THROW_EXCEPTION(InvalidParameterException, "Parameter node cannot be NULL ...");
}
return ret;
}
bool insert(const T& value, TreeNode<T>* parent)
{
bool ret = true;
GTreeNode<T>* node = GTreeNode<T>::NewNode();
if( node != NULL )
{
node->value = value;
node->parent = parent;
insert(node);
}
else
{
THROW_EXCEPTION(NoEnoughMemoryException, "No memory to create new tree node ...");
}
return ret;
}
SharedPointer< Tree<T> > remove(const T& value)
{
GTree<T>* ret = NULL;
GTreeNode<T>* node = find(value);
if( node == NULL )
{
THROW_EXCEPTION(InvalidParameterException, "Can not find the node via parameter value ...");
}
else
{
remove(node, ret);
}
return ret;
}
SharedPointer< Tree<T> > remove(TreeNode<T>* node)
{
GTree<T>* ret = NULL;
node = find(node);
if( node == NULL )
{
THROW_EXCEPTION(InvalidParameterException, "Parameter node is invalid ...");
}
else
{
remove(dynamic_cast<GTreeNode<T>*>(node), ret);
}
return ret;
}
GTreeNode<T>* find(const T& value) const
{
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()
{
free(root());
this->m_root = NULL;
}
~GTree()
{
clear();
}
};
}
#endif // GTREE_H
标签:val 分析 object 元素 int stream ext str lin
原文地址:https://www.cnblogs.com/PyLearn/p/10158757.html