1,删除的方式:

1,基于数据元素值的删除:

1,SharedPointer< Tree<T> > remove(const T& value)

1,删除的是那个以结点为根结点的子树,所以返回值是一个指向树的指针;

2,希望智能指针帮助管理这个堆空间创建出来的树;

2,基于结点的删除:

1,SharedPointer< Tree<T> > remove(TreeNode<T>* node)

2,二叉树中结点的删除:

3,删除操作功能的定义及实现:

1,void remove(BTreeNode<T>* node, BTree<T>*& ret)

1,将 node 为根结点的子树从原来的二叉树中删除;

2,ret 作为子树返回(ret 指向堆空间中的二叉树树对象);

  2,功能函数代码实现:

 1    /* 实现一个删除功能函数, ret 返回一个堆空间中的二叉树对象 */
 2     virtual void remove(BTreeNode<T>* node, BTree<T>*& ret)
 3     {
 4         ret = new BTree<T>();
 5
 6         if( ret == NULL )
 7         {
 8             THROW_EXCEPTION(NoEnoughMemoryException, "No memory to create new tree ...");
 9         }
10         else  // node 当然是不可以为空,在共有 remove() 函数中有体现,但是这样不好,建议在此处体现的好
11         {
12             if( root() == node )  // 如果删除的是根结点
13             {
14                 this->m_root = NULL;  // 根结点清空,这里有点不理解,这里 m_root 只是树指向 node 的一个指针,它不是结点的一部分;
15             }
16             else  // 断掉和父结点之间的指针
17             {
18                BTreeNode<T>* parent = dynamic_cast<BTreeNode<T>*>(node->parent);
19
20                 if( parent->left == node )  // 如果结点是父结点的左子树
21                 {
22                     parent->left = NULL;
23                 }
24                 else if( parent->right == node )  // 如果结点是父结点的右子树
25                 {
26                     parent->right = NULL;
27                 }
28
29                 node->parent = NULL;  // 删除结点的父亲
30             }
31
32             ret->m_root = node;  // 通过 ret 返回新的结点指向这里
33         }
34    }

  3,成员函数代码实现:

    1,基于数据值的代码实现:

 1    SharedPointer< Tree<T> > remove(const T& value)
 2     {
 3         BTree<T>* ret = NULL;
 4
 5         BTreeNode<T>* node = find(value);
 6
 7         if( node == NULL )
 8         {
 9             THROW_EXCEPTION(InvalidParameterException, "Can not find the tree node via value ...");
10         }
11         else
12         {
13             remove(node, ret);
14
15             m_queue.clear();
16         }
17
18         return ret;
19    }

  2,基于结点的代码实现:

 1    SharedPointer< Tree<T> > remove(TreeNode<T>* node)
 2     {
 3         BTree<T>* ret = NULL;
 4
 5         node = find(node);  // 当前要删除的结点在这个树中
 6
 7         if( node == NULL )
 8         {
 9             THROW_EXCEPTION(InvalidParameterException, "Parameter node is invalid ...");
10         }
11         else
12         {
13             remove(dynamic_cast<BTreeNode<T>*>(node), ret);
14
15             m_queue.clear();
16         }
17
18         return ret;
19     }

4,清除操作的定义:

1,void clear()

1,将二叉树中的所有结点清除(释放堆中的结点);

5,二叉树中结点的清除:

6,清除操作功能的定义及成员函数实现:

1,free(node):

1,清除 node 为根结点的二叉树;

2,释放二叉树中的每一个结点;

  2,功能函数代码实现:

 1    /* 定义清除功能函数,参数为要清除树的根结点 */
 2     virtual void free(BTreeNode<T>* node)
 3     {
 4         if( node != NULL )  // 树非空
 5         {
 6             free(node->left);
 7             free(node->right);
 8
 9             if( node->flag() )  // 如果是从堆空间申请来的
10             {
11                 delete node;
12             }
13         }
14     }

  3,clear() 成员函数代码实现:

1     void clear()
2     {
3         free(root());
4         m_queue.clear();
5         this->m_root = NULL;
6     }

7,小结:

1,删除操作将目标结点所代表的子树移除;

2,删除操作必须完善处理父结点和子结点的关系;

1,完全断绝父子关系;

3,清除操作用于销毁树中的每个结点;

4,销毁结点时判断是否释放对应的内存空间(工厂模式);

转载于:https://www.cnblogs.com/dishengAndziyu/p/10925465.html

树——二叉树结点的删除与清除相关推荐

  1. 树——二叉树结点的插入

    1,需要考虑的问题: 1,是否能够在二叉树任意结点处插入子结点? 1,不能,二叉树每个结点的成员是相对固定的,只有两个指向左右后继结点的指针成员: 2,是否需要指定新数据元素(新结点)的插入位置? 1 ...

  2. c++ 删除二叉树的子树_数据结构—树|二叉树|前序遍历、中序遍历、后序遍历【图解实现】...

    点击蓝字关注我们 AI研习图书馆,发现不一样的精彩世界 数据 结构 二叉树的遍历 一.树 在谈二叉树的知识点之前,我们首先来看一下树和图的基本概念.树:不包含回路的连通无向图,树是一种简单的非线性结构 ...

  3. 数据结构(十五) -- C语言版 -- 树 - 二叉树的操作进阶之创建、插入、删除、查询、销毁

    内容预览 零.读前说明 一.概述 二.数据模型分析创建 2.1.节点的结构模型 2.2.操作函数结构模型 三.创建 四.插入 4.1.在树中的某一个叶子节点位置插入新节点 4.2.在树中的某一个非叶子 ...

  4. 二叉树(BST树)内结点的删除(3种情况全解)

    现在有一棵二叉树查找树如下: 如果我们需要删除一个结点,而且在删除之后,依然满足二叉查找树的数据排序策略.此时删除操作可分为一下三种情况.如下 情况1:结点没有左子树 如图:一棵没有左子树的二叉树 如 ...

  5. 数据结构与算法(十三)删除二叉树结点

    删除二叉树结点 删除结点是二叉树操作中最复杂的.在删除之前首先要查找要删除的结点.找到结点后,这个要删除的结点可能会有三种情况需要考虑. 1. 该节点是叶子结点,没有子结点 要删除叶子结点,只需要改变 ...

  6. 给定一个n节点二叉树,写出一个O(n)时间的非递归的过程,将该树每个结点的关键字输出(算法导论第三版第十章10.4-5)

    给定一个n节点二叉树,写出一个O(n)时间的非递归的过程,将该树每个结点的关键字输出.要求除该树本树的存储空间外只能使用固定量的额外存储空间,且过程中不得修改该树,即使是暂时的修改也不允许. (算法导 ...

  7. 二叉树的各种操作(递归和非递归遍历,树深度,结点个数等等)

    目录 建立二叉树 递归前序和非递归前序 递归中序和非递归中序 递归后续和非递归后续(包括双栈法和设置pre结点) 层次遍历 寻找树中有没有值为x的结点 统计树中结点的个数 计算树的高度 判断两颗树是不 ...

  8. 设森林F对应的二叉树为B,它有m个结点,B的根p,p右子树结点个数n,森林F中第一棵树的结点个数

    题目:设森林F对应的二叉树为B,它有m个结点,B的根p,p右子树结点个数n,森林F中第一棵树的结点个数 设森林F对应的二叉树为B :它的意思就是将森林F转换为二叉树. 它有m个结点 :这颗二叉树总共有 ...

  9. 四 . LeetCode标签刷题——树/二叉树(一) 算法部分

    各种二叉树的介绍汇总: 二叉树:最多有两棵子树的树被称为二叉树 满二叉树:二叉树中所有非叶子结点的度都是2,且叶子结点都在同一层次上 完全二叉树:如果一个二叉树与满二叉树前m个节点的结构相同,这样的二 ...

最新文章

  1. vue组件定义、组件的切换、组件的通信、渲染组件的几种方式(标签、路由、render)...
  2. 昊天善圈浅谈比特币这个类型区块链应用技术的特点及作用
  3. 自定义webpart显示Lync状态球
  4. POJ 2955 Brackets(括号匹配一)
  5. 划重点!十分钟掌握牛顿法凸优化
  6. Django进阶之中间件
  7. 北方工业大学gpa计算_北方大学联盟仓库的探索性分析
  8. Sql Server 开窗函数Over()的使用
  9. PostgreSQL中UUID的完整指南
  10. JavaScript高级程序设计学习(二)之基本概念
  11. 一个方便快捷gif在线水印制作(支持文字和图片)
  12. Windows10系统迁移
  13. Java中Base64的解析
  14. 《七哥说道》第十三章:我的室友白羽鸡
  15. 视频服务器是什么?要如何搭建?
  16. 贵州大学计算机研究生排名,贵大计算机研究生怎么样?
  17. nb_200905_2019_cvpr_Slow-Motion from Blurry Videos
  18. 磁带备份迁移到磁盘备份前的准备工作
  19. 关于励志书及推荐《高效能人士的七个习惯》
  20. 纯css实现蓝色圆角效果水平导航菜单代码

热门文章

  1. bat脚本保存dir结果_MySQL备份脚本,应该这么写
  2. MYSQL:Error Code: 1786 Statement violates GTID consistency: CREATE TABLE ... SELECT.
  3. js中获取当前时间(yyyy-MM-dd hh-mm-ss)
  4. C程序100例 第二题
  5. Autodesk Map3d的应用和开发
  6. 流程图符号以及绘制流程图方法
  7. Lock应用之 读写锁
  8. 数据创建表 修改列 新增列
  9. 如何查询Linux服务的作用
  10. Jordan Lecture Note-9: Principal Components Analysis (PCA).