修剪二进制搜索树

时间:2011-03-22 18:37:46

标签: java binary-tree trim

我应该编写一个接收两个整数作为最小值和最大值的方法。然后它从树中删除小于最小值且大于最大值的任何整数。到目前为止我的代码非常难看,根本不起作用。我甚至不确定我是否在正确的道路上......

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 {

        }
    }
}

3 个答案:

答案 0 :(得分:2)

关于没有任何代码的算法的一些一般想法:

您需要先实施delete。二进制搜索树中的delete具有特定且定义明确的行为;你需要先实现这个(你的教授应该已经过去了)。我说80%的工作都是在这里完成的。

剩下的20%用于实现find功能。您现在可以组合这两个函数并实现trim函数。

如果您解释到目前为止所做的事情,我们可能会给您一些提示并让您朝着正确的方向前进。这里重要的是要学习!

<强>更新

是的,您需要遍历树并删除符合条件的节点。就递归而言,请考虑如何正常遍历二叉搜索树。

现在您需要添加containsremove。这部分是微不足道的,但棘手的部分是树正在改变,因为你正在穿越它。但如果你考虑一下,那应该不会那么难。提示:当您删除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。

的问候。