Java 给定最小值和最大值的二叉树递归遍历

Java 给定最小值和最大值的二叉树递归遍历,java,recursion,binary-tree,traversal,Java,Recursion,Binary Tree,Traversal,问题(必须是递归的): 编写一个函数,该函数取二叉树的根以及一个最小值和最大值,并查找树中介于这些值之间的所有节点,同时尽可能少地访问其他节点 public boolean inRange(Node node, int max, int min) { return root.element() < max && root.elemnt() > min; } public void inRangeFinder(Node root, int max, int mi

问题(必须是递归的): 编写一个函数,该函数取二叉树的根以及一个最小值和最大值,并查找树中介于这些值之间的所有节点,同时尽可能少地访问其他节点

public boolean inRange(Node node, int max, int min)
{
    return root.element() < max && root.elemnt() > min;
}
public void inRangeFinder(Node root, int max, int min)
{
    if (root == null) return; //break
    if(inRange(root, max, min))
        visit(root); //mark as found
    finder(root.leftChild());
    finder(root.rightChild());
}
public boolean inRange(节点节点,int max,int min)
{
返回root.element()min;
}
RangeFinder中的公共void(节点根、int max、int min)
{
if(root==null)返回;//中断
if(范围(根、最大值、最小值))
访问(根);//标记为已找到
finder(root.leftChild());
finder(root.rightChild());
}

我的问题是,第一个陈述是否必要?它会导致我的左右子树遍历出现问题吗?最重要的是,这是访问量最少的方法吗?

更新:对不起,我不知道您的程序是用java编写的。我不是java用户,所以答案可能不正确。请原谅

是的,第一个if语句是必需的。如果你取消了If 语句时,您的程序在访问 空指针

这基本上是左手边第一个dfs搜索,所以它访问 每个节点只有一次。如果树没有组织,则使用此方法 花费尽可能少的访问。但是如果树是有组织的树, 您必须重新定义方法,以适应特定的树类型 获得最少的访问

为了递归,应该定义函数名 始终如一

public void finder(Node root, int max, int min)
          //^^^^^ be the same with your recursive call
{
    if (root == null) return; //break
    if(inRange(root, max, min))
        visit(root); //mark as found
    finder(root.leftChild(),max,min);
                          //^^same arguments
    finder(root.rightChild(),max,min);
                          //^^
}

如果你有一棵树,它是以简单的方式组织的,那么你就不必做If语句

这实际上取决于您的树实现

顺序树的伪代码

-find value with min key.
-travers in order 
    - and check if result of 
      in order traversal result meets max condition
在我看来,你甚至不必检查特定的范围

范例

                 5
              4      8     
            2       6    9    
              3             
顺序意味着只使用左时间叶遍历每个节点

所以要在范围内找到一个特定的区域。实现顺序查找 然后对最小值执行它。并且只要您的实现 查找最大值的顺序值

但是,请尝试保存此过程的结果,以获得您想要的序列


希望能有点帮助

当然有必要。你还要怎么处理树叶?在询问之前,您没有用一些测试用例来测试您的代码吗?