Java 修剪二叉搜索树

Java 修剪二叉搜索树,java,binary-tree,trim,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){

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

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 {

        }
    }
}
私有搜索树修剪(搜索树节点e、最小整数、最大整数){
如果(e!=null){

if(e.left.data.compareTo(min)关于无代码算法的一些一般想法:

您需要首先实现
delete
delete
在二叉搜索树中有特定且定义良好的行为;您需要首先实现这一点(您的教授应该已经检查过了)。我想您80%的工作是在这里完成的

剩下的20%用于实现
find
功能。您现在可以将这两个功能结合起来,实现
trim
功能

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

更新

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


现在您需要添加
包含
删除
。这一部分很简单,但棘手的是树在您遍历它的过程中正在发生变化。但是如果您仔细想想,它应该不会那么难。提示:当您删除BST中的节点时,您实际上不会删除它,除非它是叶节点。您只需替换它的v值。因此遍历不应受到影响。

关于无代码算法的一些一般想法:

您需要首先实现
delete
delete
在二叉搜索树中有特定且定义良好的行为;您需要首先实现这一点(您的教授应该已经检查过了)。我想您80%的工作是在这里完成的

剩下的20%用于实现
find
功能。您现在可以将这两个功能结合起来,实现
trim
功能

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

更新

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


现在您需要添加
包含
删除
。这一部分很简单,但棘手的是树在您遍历它的过程中正在发生变化。但是如果您仔细想想,它应该不会那么难。提示:当您删除BST中的节点时,您实际上不会删除它,除非它是叶节点。您只需替换它的v所以遍历不应该受到影响。

问题的伪代码是

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;
   }
}
节点修剪(节点e、最小整数、最大整数){
如果(最小值e.data&&max>e.data){
回位阀内件(如右侧、最小值、最大值);
}否则{
if(最小e.左数据){
e、 左=空;
}否则{
修剪(如左侧、最小值、最大值);
}
如果(max>=e.data&&e.right!=null&&e.right.data>max){
e、 右=空;
}否则{
微调(如右侧、最小值、最大值);
}
返回e;
}
}

问题的伪代码是

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;
   }
}
节点修剪(节点e、最小整数、最大整数){
如果(最小值e.data&&max>e.data){
回位阀内件(如右侧、最小值、最大值);
}否则{
if(最小e.左数据){
e、 左=空;
}否则{
修剪(如左侧、最小值、最大值);
}
如果(max>=e.data&&e.right!=null&&e.right.data>max){
e、 右=空;
}否则{
微调(如右侧、最小值、最大值);
}
返回e;
}
}

也许您可以实现迭代器接口,遍历构成BST的元素,将满足约束的元素放入新的BST中 然后你将你原来的BST与新的BST相等


关于。

也许您可以实现迭代器接口,检查构成BST的元素,满足约束的元素将被放入新的BST中 然后你将你原来的BST与新的BST相等


关于。

想象一下你将如何手工操作,然后尝试用Java编写该方法。如果给你一个排序列表,并且必须删除小于特定最小值的所有元素,你将如何操作?二元搜索树与排序列表有何区别?它有何区别?+1@ChrisJ。这样做很糟糕,而且随着问题的出现,情况只会变得更糟arder,但是没有什么比真正理解它并完成它更好的了。为什么不在开始删除元素之前递归到树下呢。这可能会对您有所帮助;)想象一下,你将如何手工操作,然后尝试用Java编写该方法。如果给你一个排序列表,并且必须删除小于特定最小值的所有元素,你将如何操作?二元搜索树与排序列表有何区别?它有何区别?+1@ChrisJ。这样做很糟糕,而且随着问题变得越来越难,情况只会变得更糟,但情况确实如此没有什么比实际理解它并完成它更好的了。在开始删除元素之前,为什么不在树上递归。这可能会对您有所帮助;)我有“删除”和“包含”方法。我可以使用contains方法检查树是否包含大于或小于max和min的值吗?我猜如果返回true,那么我将运行remove方法。但是,我不确定如何实现递归。我有“remove”和“contains”方法。我可以使用contains方法检查树中是否包含大于或小于max和min的值吗?我猜如果返回true,那么我将运行remo