java中的二叉搜索树递归子树

java中的二叉搜索树递归子树,java,binary-tree,Java,Binary Tree,有人能给我举一个代码示例(最好是java)或psuedocode,它使用递归返回子树,子树包含所有节点,其键在fromKey和toKey之间 因此,如果我要调用Tree.subtree(5,10),它应该返回BST中键在5到10之间(包括5到10)的所有节点-但我不能使用循环或帮助器方法…只能递归调用subtree方法,该方法将fromKey和toKey作为参数 谢谢 更新: 我尝试了以下不起作用的方法: public Tree subtree(int from, int to) { le

有人能给我举一个代码示例(最好是java)或psuedocode,它使用递归返回子树,子树包含所有节点,其键在fromKey和toKey之间

因此,如果我要调用Tree.subtree(5,10),它应该返回BST中键在5到10之间(包括5到10)的所有节点-但我不能使用循环或帮助器方法…只能递归调用subtree方法,该方法将fromKey和toKey作为参数

谢谢

更新:

我尝试了以下不起作用的方法:

public Tree subtree(int from, int to) {
   left.subtree(from, to);
   right.subtree(from, to);
   if (this.key < from || this.key > to) {
      this.delete(this.key);
   }
   return this;   
}
公共树子树(int-from,int-to){
左。子树(从、到);
右。子树(从,到);
if(this.keyto){
this.delete(this.key);
}
归还这个;
}

我认为问题在于它返回得太早。我要做的是遍历树上的每个节点,并删除任何不在范围内的节点。我走对了吗?

子树是否应该返回原始树的副本,而不是从中删除关键点?原始递归是如何终止的

我想推荐如下:

public static Tree subtreeNullSafe(Tree t, int from, int to) {
   return t == null ? null : t.subtree(from, to);
}

public Tree subtree(int from, int to) {
   if (this.key > to) {
     return subtreeNullSafe(this.left, from, to);
   } else if (this.key < from) {
     return subtreeNullSafe(this.right, from, to);
   } else {
     // we know that this.key <= to and this.key >= from
     return new Tree(
       this.key,
       subtreeNullSafe(this.left, from, to),
       subtreeNullSafe(this.right, from, to)
     );
   }
}
publicstatictree subtreeNullSafe(树t,int-from,int-to){
返回t==null?null:t.subtree(from,to);
}
公共树子树(int-from,int-to){
如果(this.key>to){
返回subtrenullsafe(this.left、from、to);
}else if(this.key

这确实使用了辅助方法来减少重复。您可以直接内联
null
检查您是否真的被禁止使用它。

非常感谢!我并没有将构造函数设置为使用左树和右树参数——只要我在您的解决方案中看到它,它就会单击。