- 删除的方式
— 基于数据元素值的删除:SharedPointer< Tree<T> > remove(const T& value)
— 基于结点的删除:SharedPointer< Tree<T> > remove(TreeNode<T>* node)
- 二叉树中结点的删除
- 删除操作功能的定义
—virtual void remove(BTreeNode<T>* node, BTree<T>*& ret)
1、将 node 为根结点的子树从原来的二叉树中删除,
2、ret 作为子树返回(ret 指向堆空间中的二叉树对象)
- 清除操作的定义:
void clear()
— 将二叉树中的所有结点清除(释放堆中的结点)
free(node)
— 清除 node 为根结点的二叉树
— 释放二叉树中的每一个结点
BTree.h
protected:
virtual void remove(BTreeNode<T>* node, BTree<T>*& ret)
{
ret = new BTree<T>();
if( ret == NULL )
{
THROW_EXCEPTION(NoEnoughMemoryException, "No memroy to create new tree ...");
}
else
{
if( root() == node )
{
this->m_root = NULL;
}
else
{
BTreeNode<T>* parent = dynamic_cast<BTreeNode<T>*>(node->parent);
if( parent->left == node )
{
parent->left = NULL;
}
else if( parent->right == node )
{
parent->right = NULL;
}
node->parent = NULL;
}
ret->m_root = node;
}
}
virtual void free(BTreeNode<T>* node)
{
if( node != NULL )
{
free(node->left);
free(node->right);
if( node->flag() )
{
delete node;
}
}
}
public:
SharedPointer< Tree<T> > remove(const T& value) //删除的节点的子节点我们还需要处理,因此要返回删除节点的指针,//这样有机会对里面的元素做进一步操作
{
BTree<T>* ret = NULL;
BTreeNode<T>* node = find(value);
if( node == NULL )
{
THROW_EXCEPTION(InvalidParameterException, "Can not find the tree node via value ...");
}
else
{
remove(node, ret);
}
return ret;
}
SharedPointer< Tree<T> > remove(TreeNode<T>* node)
{
BTree<T>* ret = NULL;
node = find(node);
if( node == NULL )
{
THROW_EXCEPTION(InvalidParameterException, "Parament node is invalid ...");
}
else
{
remove(dynamic_cast<BTreeNode<T>*>(node), ret);
}
return ret;
}
void clear()
{
free(root());
this->m_root = nullptr;
}
main.cpp
#include <iostream>
#include "BTree.h"
using namespace std;
using namespace XiebsLib;
int main()
{
BTree<int> bt;
BTreeNode<int>* n = nullptr;
bt.insert(1, nullptr);
n = bt.find(1);
bt.insert(2, n);
bt.insert(3, n);
n = bt.find(2);
bt.insert(4, n);
bt.insert(5, n);
n = bt.find(4);
bt.insert(8, n);
bt.insert(9, n);
n = bt.find(5);
bt.insert(10, n);
n = bt.find(3);
bt.insert(6, n);
bt.insert(7, n);
n = bt.find(6);
bt.insert(11, n, LEFT);
bt.remove(3);
int a[] = {8, 9, 10, 11, 7};
for(int i = 0; i < 5; i++)
{
TreeNode<int>* node = bt.find(a[i]);
while( node )
{
cout << node->value << " ";
node = node->parent;
}
cout << endl;
}
return 0;
}
- 小结
1、删除操作将目标结点所代表的子树移除
2、删除操作必须完善处理父结点和子结点的关系
3、清除操作作用于销毁树中的每个结点
4、销毁结点时判断是否释放对应的内存空间(工厂模式)