1、二叉树中的结点删除
删除的方式
-基于数据元素值的删除
SharedPointer< Tree<T> > remove(const T& value)
-基于结点的删除
SharedPointer< Tree<T> > remove(TreeNode<T>* node)二叉树中结点的删除
删除操作功能的定义
- void remove(BTreeNode<T>* node, BTree<T>*& ret)
将node为根结点的子树从原来的二叉树中删除
ret作为子树返回(ret指向堆空间中的二叉树对象)
删除功能函数的实现
2、编程实验
二叉树结点的删除操作BTree.h
protected新增
- virtual void remove(BTreeNode<T>* node,BTree<T>*& ret)
- {
- ret = new BTree<T>();
- if(ret == NULL)
- {
- THROW_EXCEPTION(NoEnoughMemoryException,"No memory 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;
- }
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,"Parameter node is invalid ...");
- }
- else
- {
- remove(dynamic_cast<BTreeNode<T>*>(node),ret);
- }
- return ret;
- }
main.cpp
#include <iostream> #include"BTree.h" using namespace std; using namespace DTLib; int main() { BTree<int> bt; BTreeNode<int>* n = NULL; bt.insert(1,NULL); 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); int a[] = {8,9,10,11,7}; SharedPointer< Tree<int> > sp = bt.remove(3); for(int i=0;i<5;i++) { TreeNode<int>* node = sp->find(a[i]); while(node) { cout<<node->value<<" "; node = node->parent; } cout<<endl; } return 0; }
3、二叉树中的结点清除
清除操作的定义
- void clear()
将二叉树中的所有结点清除( 释放堆中的结点) 二叉树中结点的清除
递归的操作
清除操作功能的定义
- free(node)
清除node为根结点的二叉树
释放二叉树中的每一个结点
4、编程实验
清除二叉树中的结点protected新增
- virtual void free(BTreeNode<T>* node)
- {
- if(node != NULL)
- {
- free(node->left);
- free(node->right);
- if(node->flag())
- {
- delete node;
- }
- }
- }
public
- void clear()
- {
- free(root());
- this->m_root = NULL;
- }
5、小结
制除操作将目标结点所代表的子树移除
删除操作必须完善处理父结点和子结点的关系
清除操作用于销毁树中的每个结点
销毁结点时判断是否释放对应的内存空间( 工厂模式)6、实战预告
To be continued…
思考:
如何实现BTree (二叉树结构)的属性操作函数?