二叉搜索树删除结点时指针问题(邓俊辉数据结构)
新手学习数据结构时遇到了些问题,想请教各位大佬。
在看清华大学邓俊辉网课数据结构 二叉搜索树删除结点时 看到这样一段代码:
仅讨论第三部分remove_At函数第6行 删除的结点x只有右子树的情况,假设y为x的父节点,并且x是y的右子树,那么第6行只做了x=x->rc仅用子树将其覆盖,为什么不需要将y->rc=x->rc?
x的父节点的成员rc,保存的不应该是x的 值 吗?x为要删除的二叉树节点指针, 给x赋值,x变化了,但是y->rc保存的值并没有变吧?
在看清华大学邓俊辉网课数据结构 二叉搜索树删除结点时 看到这样一段代码:
#define BinNodePosi(T) BinNode<T>*//节点位置
template <typename T> BinNodePosi(T) & BST<T>::search ( const T & e ) { //在BST中查找关键码e
if ( !_root || e == _root->data ) {
_hot = NULL;
return _root;
} //在树根v处命中
for ( _hot = _root; ; ) { //自顶而下
BinNodePosi(T) & c = ( e < _hot->data ) ? _hot->lc : _hot->rc; //确定方向
if ( !c || e == c->data )
return c;
_hot = c; //命中返回,或者深入一层
} //无论命中或失败,hot均指向v之父亲(或为NULL)
} //返回目标节点位置的引用,以便后续插入、删除操作
template <typename T> bool BST<T>::remove ( const T& e ) { //从BST树中删除关键码e
BinNodePosi(T) & x = search ( e );
if ( !x ) return false; //确认目标存在(留意_hot的设置)
removeAt ( x, _hot );
_size--; //实施删除
updateHeightAbove ( _hot ); //更新_hot及其历代祖先的高度
return true;
} //删除成功与否,由返回值指示
template <typename T>
static BinNodePosi(T) removeAt ( BinNodePosi(T) & x, BinNodePosi(T) & hot ) {
BinNodePosi(T) w = x; //实际被摘除的节点,初值同x
BinNodePosi(T) succ = NULL; //实际被删除节点的接替者
if ( !HasLChild ( *x ) ) //若*x的左子树为空,则可
succ = x = x->rc; //直接将*x替换为其右子树
else if ( !HasRChild ( *x ) ) //若右子树为空,则可
succ = x = x->lc; //对称地处理——注意:此时succ != NULL
else { //若左右子树均存在,则选择x的直接后继作为实际被摘除节点,为此需要
w = w->succ(); //(在右子树中)找到*x的直接后继*w
swap ( x->data, w->data ); //交换*x和*w的数据元素
BinNodePosi(T) u = w->parent;
( ( u == x ) ? u->rc : u->lc ) = succ = w->rc; //隔离节点*w
}
hot = w->parent; //记录实际被删除节点的父亲
if ( succ )
succ->parent = hot; //并将被删除节点的接替者与hot相联
release ( w->data );
release ( w );
return succ; //释放被摘除节点,返回接替者
} //release()负责释放复杂结构,与算法无直接关系,具体实现详见代码包
仅讨论第三部分remove_At函数第6行 删除的结点x只有右子树的情况,假设y为x的父节点,并且x是y的右子树,那么第6行只做了x=x->rc仅用子树将其覆盖,为什么不需要将y->rc=x->rc?
x的父节点的成员rc,保存的不应该是x的 值 吗?x为要删除的二叉树节点指针, 给x赋值,x变化了,但是y->rc保存的值并没有变吧?
...全文
相关推荐
清华大学邓俊辉教授数据结构(下)MOOC习题
**二叉搜索树**:二叉搜索树是一种特殊的二叉树,其中每个节点的左子树只包含比节点小的元素,右子树包含比节点大的元素。这种结构支持快速的查找、插入和删除操作,是数据结构中的重要一环。6.
数据结构精讲:邓俊辉教授的超高清教材指南
在计算机科学中,数据结构是组织和存储数据的一种方式,以便能够高效地访问和修改数据。它不仅关系到数据存储,还包括数据的逻辑关系、操作方法和应用环境。数据结构可以根据数据元素之间的关系分为线性结构和非线性结构两大类。线性结构的数据元素之间是一对一的关系,而非线性结构的数据元素之间存在着一对多或多对多的关系。进一步的分类还包括集合、映射、树、图等数据结构。栈是一种后进先出(Last In, First Out,LIFO)的数据结构,它只允许在表的一端进行插入和删除操作。
邓俊辉老师的数据结构与算法课程代码bst实现
邓俊辉老师的“数据结构与算法”课程是许多学习者深入了解计算机科学基础的重要资源,其中BST(Binary Search Tree,二叉搜索树)的实现部分是关键知识点之一。
邓俊辉版java 数据结构源码
《邓俊辉版Java数据结构源码》是学习数据结构与算法的重要参考资料,它与邓俊辉教授编写的《Java数据结构》教材相配套,旨在帮助读者深入理解数据结构的概念和实现方法。
清华邓俊辉数据结构
### 清华邓俊辉数据结构#### 一、绪论与课程介绍根据提供的文件信息,本课程是由清华大学的邓俊辉教授所编写的关于数据结构与算法的教材,该教材采用C++语言实现。


