美文网首页
64_二叉树的结点删除与清除

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

作者: 编程半岛 | 来源:发表于2018-07-27 15:58 被阅读20次

关键词:二叉树的结点的删除、二叉树的结点的清除

0. 删除的方式

  • 基于数据元素值的删除: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指向堆空间中的二叉树对象)
      删除功能函数的实现流程图
    virtual void remove(BTreeNode<T>* node, BTree<T>*& ret)
    {
        ret = new BTree<T>();

        if( ret != NULL )
        {
            if( root() != node )
            {
                BTreeNode<T>* p = dynamic_cast<BTreeNode<T>*>(node->parent);

                if( p->left == node )
                {
                    p->left = NULL;
                }
                else if( p->right == node )
                {
                    p->right = NULL;
                }

                node->parent = NULL;
            }
            else
            {
                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)
    {
        BTree<T>* ret = NULL;
        BTreeNode<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)
    {
        BTree<T>* ret = NULL;

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

        return ret;
    }

1. 清除操作

  • void clear():将二叉树中的所有结点清除(释放堆中的结点)
    二叉树中结点的清除示意图
  • 清除操作功能的定义:free(node)
    • 清除node为根结点的二叉树
    • 释放二叉树中的每一个结点


      清除操作的递归调用
    virtual void free(BTreeNode<T>* node)
    {
        if( node != NULL )
        {
            free(node->left);
            free(node->right);

            if( node->flag() )
            {
                delete node;
            }
        }
    }

    void clear()
    {
        free(root());

        this->m_root = NULL;
    }

2. 小结

  • 删除操作将目标结点所代表的子树移除
  • 删除操作必须完善处理父结点和子结点的关系
  • 清除操作用于销毁树中的每个结点
  • 销毁结点时判断释放对应的内存空间(工厂模式)

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

相关文章

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

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

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

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

  • 数据结构与算法树与二叉树的应用

    1.二叉排序树BST左子树结点值小于根结点值小于右子树结点值 2.平衡二叉树在插入和删除二叉树结点时,要保证任意结...

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

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

  • 2. 二叉树 BinTree

    二叉树的实现 BinNode : 二叉树结点 二叉树结点结构代码 : 二叉树常用接口实现 将新结点作为左/右孩子插...

  • 小朋友学数据结构(3):二叉树的建立和遍历

    一、基本概念 二叉树:每个结点的子结点个数不大于2的树,叫做二叉树。根结点:最顶部的那个结点叫做根结点,根结点是所...

  • 算法:链表

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

  • 树与二叉树

    树与二叉树的特性: (1)树的概念: 双亲、孩子和兄弟:结点的子树的根称为该结点的孩子;相应地,该结点称为其子结点...

  • [29无验证]共同父节点-七牛云2018秋

    1.题目描述 二叉树的结点定义如下: 输入二叉树中的两个结点,输出这两个结点在二叉树中最低的共同父结点。 2.题目...

  • 完全二叉树基本知识(一)

    二叉树: 特点是与每个结点关联的子结点至多有两个(可为0,1,2),即一个结点至多有两棵子树。二叉树的两棵子树分别...

网友评论

      本文标题:64_二叉树的结点删除与清除

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