您的位置:首页 > 理论基础 > 数据结构算法

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

2016-06-11 17:55 936 查看
数据结构自习笔记之二叉树;
今天看到的章节为二叉查找树,关于删除结点的方法,用笔记记录;
书中介绍的方法为 复制删除(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;
}


// 才疏学浅,如有不足,多多指正
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 二叉树