在尝试从二叉树中删除该节点有 2 个子节点的节点时,我很难思考如何修复适当的指针。
我理解基本概念,我基本上只是在修复指针时遇到了麻烦......
所以,基本上,我的删除功能已经基本完成,每个案例都已经在工作(就我的广泛测试而言,一切正常),我只缺少有 2 个孩子的案例节点。假设我们在else if
处理该案例的内部:
我将在那里有 2 个指针,currPtr
它保存要删除的节点,prevPtr
它保存父节点。我还有一个名为的变量fromLeft
,它定义了currPtr
父级是来自左指针还是右指针prevPtr
。然后,我调用了另一个名为的函数extractMin(Tree *t)
,该函数提取了树中的最小值。如果我用currPtr->right
作为参数调用此函数,将从树中提取 的后继者currPtr
(该函数将从树中删除它,修复指针并返回节点指针)。后继指针将保存在tempPtr
.
这是我的树的结构:
typedef int TreeElement;
typedef struct sTree {
TreeElement item;
struct sTree *left;
struct sTree *right;
} Tree;
以及提取功能的代码:
Tree *extractMin(Tree *tree) {
Tree *prevPtr = NULL;
Tree *currPtr = tree;
while(currPtr->left) {
prevPtr = currPtr;
currPtr = currPtr->left;
}
if(prevPtr) prevPtr->left = currPtr->right;
// inorder successor
return currPtr;
}
上面的代码缺少树只有一个节点的情况,即根节点,它不能正常工作,也不会检查树是否有任何节点,但是,当树有几个节点时它可以工作节点。
那么,如何修复else if
节点删除的必要指针?另外,请记住,树节点上的left
andright
指针将始终指向某处或 be NULL
。
顺便说一句,我想做这个迭代。