我已经使用节点(表示为用户)实现了二叉搜索树,但是我无法使deFriend()
方法工作。该方法应该从树中删除节点,同时保持二叉搜索树的“规则” - 例如root大于左子树,但小于右子树。
据我所知,从二叉搜索树中删除节点时,我应该考虑3种情况:
1 - 当要删除的节点没有子节点时,
2 - 当要删除的节点有一个子节点时,
3 - 当要删除的节点有两个子节点时。无法想出这一个
我的deFriend()
方法适用于前两种情况,但不适用于最后一种情况。我甚至知道我需要用什么节点替换它,如果它是第三种情况,但我不能用代码来解决它。我可以将其概念化或在纸上绘制,但我无法将其转换为代码。我已经包含了我认为修复问题所必需的两个类的链接。我确信我的问题出在我BinaryTree
班的第111和114行之间。提前致谢。
用户类:matrix right division operator /
BinaryTree类:https://gist.github.com/anonymous/732f02628f6edf622d88363b68cf22ee
答案 0 :(得分:0)
从二叉搜索树中删除节点时,必须维护节点的有序顺序。有三种可能的情况需要考虑:
如果节点没有子节点,只需从树中删除节点。
如果节点有一个子节点删除该节点并将其替换为其子节点。
如果节点D有两个孩子,请不要删除它。相反,选择其有序前任节点或其有序后继节点作为替换节点E.将E的用户值复制到D.如果E没有子节点,只需从其前一个父节点中删除E.如果E有一个孩子,比如F,那就是一个正确的孩子。在E的父母处用E替换E.