二叉查找树/删除结点操作

来源:互联网 发布:如何关闭4g网络 编辑:程序博客网 时间:2024/04/29 18:30
数据结构自习笔记之二叉树;今天看到的章节为二叉查找树,关于删除结点的方法,用笔记记录;书中介绍的方法为 复制删除(deletion by copying)

通常来说,二叉树结点删除的情况有四种;

①待删除结点(以下直接称为结点)为叶结点, 这种情况只要直接delete;

②,③ 结点的左子树或右子树为空, 这两种情况用非空子树的结点覆盖结点;

④结点左右子树均为非空;
这种情况下就用到今天学习到的复制删除;
算法思想:
// 首先定位前驱。为此,需要向左移一步,收到先找到要删除节点左子树//的根,再尽可能的向右移动。之后用找到结点的键值替换要删除结点的//键值(书中摘抄)
操作:
用结点左子树中最右的结点中的值替换结点的值,再删除这个最右结点,该结点的左子树结点代替该节点原来的位置

如图:
这里写图片描述

具体代码:

template<class T>void BST<T>::deletebyCopying(BSTNode<T>* &node){    BSTNode<T> *previous, *temp = node;    if(0 == node->right)        node = node->left;    else if(0 == node->left)        node = node->right;    else{        temp = node->left;        previous = node;        while(temp->right != 0){        previous = temp;        temp = temp->right;        }    node->Element = temp->Element;    if(previous == node)        previous->left = temp->left;    else        previous->right = temp->left;    }    delete temp;}

// 才疏学浅,如有不足,多多指正

1 0