美文网首页我爱编程
56_树中结点的删除操作

56_树中结点的删除操作

作者: 编程半岛 | 来源:发表于2018-07-26 09:51 被阅读9次

关键词:结点的删除

0. 删除方式

  • 基于数据元素值的删除:SharedPoiter<Tree<T>> remove(const T& value)
  • 基于结点的删除:SharedPoiter<Tree<T>> remove(TreeNode<T>* node)

1. 删除操作成员函数的设计要点

  • 将被删除结点所代表的子树进行删除
  • 删除函数返回一颗堆空间中的树
  • 具体返回值为指向树的智能指针对象
    树中结点的删除

实用的设计原则:当需要从函数中返回堆中的对象时,使用智能指针SharedPointer作为函数的返回值。

2. 删除操作功能的定义

void remove(GTreeNode<T>* node, GTree<T>*& ret):

  • node为根节点的子树从原来的树中删除
  • ret作为子树返回(ret指向堆空间中的树对象)
    删除功能函数的实现
    void remove(GTreeNode<T>* node, GTree<T>*& ret)
    {
        ret = new GTree<T>();

        if( ret != NULL )
        {
            if( root() != node )    // 当node结点不为root()结点时
            {
                LinkList<GTreeNode<T>*>& child = dynamic_cast<GTreeNode<T>*>(node->parent)->child;   // 父结点的孩子链表

                child.remove(child.find(node)); // 删除链表中的node结点

                node->parent = NULL;    // 将node结点的parent指针置为空
            }
            else                    // 当node结点为root()结点时
            {
                this->m_root = NULL;
            }

            ret->m_root = node;
        }
        else
        {
            THROW_EXCEPTION(NoEnoughMemoryExcetion, "No memory to create a new tree ...");
        }

    }

    SharedPointer< Tree<T> > remove(const T& value)
    {
         GTree<T>* ret;
         GTreeNode<T>* node = find(value);

         if( node != NULL )
         {
             remove(node, ret);
         }
         else
         {
             THROW_EXCEPTION(InvalidParameterExcetion, "Can not find node via value...");
         }

        return ret;
    }

    SharedPointer< Tree<T> > remove(TreeNode<T>* node)
    {
        GTree<T>* ret;

        if( find(node) != NULL )
        {
            remove(dynamic_cast<GTreeNode<T>*>(node), ret);
        }
        else
        {
            THROW_EXCEPTION(InvalidParameterExcetion, "Parameter node invalid...");
        }

       return ret;
    }

3. 小结

  • 删除操作将目标结点所代表的子树移除
  • 删除操作必须完善处理父结点和子结点的关系
  • 删除操作的返回值为指向树的智能指针对象
  • 函数中返回堆中的对象时,使用智能指针作为返回值

声明:此文章仅是本人在学习狄泰学院《数据结构实战开发教程》所做的笔记,文章中包含狄泰软件资料内容,一切版权归狄泰软件所有!
实验环境:ubuntu10 + Qt Creator2.4.1 + Qt SDK 4.7.4

相关文章

  • 56_树中结点的删除操作

    关键词:结点的删除 0. 删除方式 基于数据元素值的删除:SharedPoiter > remove(const ...

  • 数据结构题目50:二叉树的删除

    题目:删除二叉树的结点。这里所说的二叉树的删除是指 删除并释放该二叉树中数据域内容为item的那个结点和以该结点为...

  • 数据结构题目58:在二叉排序树中删除结点

    题目:在二叉排序树中删除由p所指结点。 解题思路:这里讨论的在二叉排序树中删除一个结构是指仅删除指定结点,而不是把...

  • 数据结构题目56:线索二叉树的更新

    题目:线索二叉树的更新所谓线索二叉树的更新是指在线索二叉树中插入一个结点或者删除一个结点。一般情况下,这些操作有可...

  • 64_二叉树的结点删除与清除

    关键词:二叉树的结点的删除、二叉树的结点的清除 0. 删除的方式 基于数据元素值的删除:SharedPointer...

  • 算法:链表

    237 删除链表中的节点先复制其他结点内容到当前结点,再删除其他结点,实现删除当前结点。 19 删除链表的倒数第N...

  • 链表删除结点操作

    前提 这个链表不存在重复值的结点 思路 找到这个结点操作被删除结点的前后指针 复杂度 O(n) 因为你要找到这个结...

  • JavaScript 基本语法

    常见用途 HTML DOM 操作(结点操作,比如添加、修改、删除结点) 给网页增加动态功能 js 输出与调试

  • 链表-删除链表中重复的结点-java

    删除链表中重复的结点 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返...

  • JZ-056-删除链表中重复的结点

    删除链表中重复的结点 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返...

网友评论

    本文标题:56_树中结点的删除操作

    本文链接:https://www.haomeiwen.com/subject/otummftx.html