从二叉搜索树返回已删除的节点
Posted
技术标签:
【中文标题】从二叉搜索树返回已删除的节点【英文标题】:Returning deleted node from binary search tree 【发布时间】:2017-06-04 18:59:10 【问题描述】:我正在尝试编写一个通过给定值从 BST 中删除节点的方法,我需要它来返回这个已删除的值。我找到了递归实现的各种示例,但由于它们的性质,它们不能返回已删除的节点,而是返回根。这就是我现在所拥有的
public TreeNode remove(TreeNode node, int data)
if (null == node)
return null;
if (data < node.st.getkey())
node.left = remove(node.left, data);
else if (data > node.st.getkey())
node.right = remove(node.right, data);
else // case for equality
if (node.left != null && node.right != null)
TreeNode minInRightSubTree = min(node.right);
copyData(node , minInRightSubTree);
node.right = remove(node.right, minInRightSubTree.st.getkey());
else
if (node.left == null && node.right == null)
node = null;
else // one child case
TreeNode deleteNode = node;
node = (node.left != null) ? (node.left) : (node.right);
deleteNode = null;
return node;
我能想出一些技巧让它返回已删除的节点,还是我应该研究迭代算法(如果是这样,如果你能给我提供链接,我将不胜感激)。
【问题讨论】:
【参考方案1】:您不仅可以返回根,还可以返回一对根和已删除的节点(如果没有删除任何内容,则返回 null)。
您可以使用 Map.Entry 或新类来存储 2 个字段(我会推荐新类,因为它更具描述性)。
所以你可能的新签名是public Map.Entry<TreeNode, TreeNode> remove(TreeNode node, int data)
【讨论】:
我刚刚提出了声明一个辅助公共节点来保存 lastRemovedNode 的想法。以上是关于从二叉搜索树返回已删除的节点的主要内容,如果未能解决你的问题,请参考以下文章
数据结构与算法之深入解析“把二叉搜索树转换为累加树”和“从二叉搜索树到更大和树”的求解思路与算法示例
数据结构与算法之深入解析“从二叉搜索树到更大和树”的求解思路与算法示例
数据结构 - 从二叉搜索树说到AVL树之二叉搜索树的操作与详解(Java)
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用