我应该编写一个接收两个整数作为最小值和最大值的方法。然后它从树中删除小于最小值且大于最大值的任何整数。到目前为止我的代码非常难看,根本不起作用。我甚至不确定我是否在正确的道路上......
private SearchTree<Integer> trim(SearchTreeNode<Integer> e, int min, int max){
if (e != null){
if (e.left.data.compareTo(min) <= 0){
remove((E) e.left);
} else {
}
}
}
答案 0 :(得分:2)
关于没有任何代码的算法的一些一般想法:
您需要先实施delete
。二进制搜索树中的delete
具有特定且定义明确的行为;你需要先实现这个(你的教授应该已经过去了)。我说80%的工作都是在这里完成的。
剩下的20%用于实现find
功能。您现在可以组合这两个函数并实现trim
函数。
如果您解释到目前为止所做的事情,我们可能会给您一些提示并让您朝着正确的方向前进。这里重要的是要学习!
<强>更新强>
是的,您需要遍历树并删除符合条件的节点。就递归而言,请考虑如何正常遍历二叉搜索树。
现在您需要添加contains
和remove
。这部分是微不足道的,但棘手的部分是树正在改变,因为你正在穿越它。但如果你考虑一下,那应该不会那么难。提示:当您删除BST中的节点时,除非它是叶节点,否则实际上不会删除它。你只需要替换它的价值。因此,遍历不应受到影响。
答案 1 :(得分:1)
您的问题的伪代码是。
node trim(node e, int min ,int max){
if(min < e.data && max < e.data){
return trim(e.left,min,max);
}else if(min > e.data && max > e.data){
return trim(e.right,min,max);
}else {
if(min <= e.data && e.left != null && min > e.left.data){
e.left=null;
} else {
trim(e.left, min,max);
}
if(max >= e.data && e.right !=null && e.right.data > max){
e.right=null;
}else{
trim(e.right, min,max);
}
return e;
}
}
答案 2 :(得分:0)
也许您可以实现迭代器接口,遍历构成BST的元素,将符合约束条件的元素放入新的BST中 然后你让原来的BST等于新的BST。
的问候。