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

时间:2013-12-16 07:45:53

标签: 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 min)
{
    if (root == null) return; //break
    if(inRange(root, max, min))
        visit(root); //mark as found
    finder(root.leftChild());
    finder(root.rightChild());
}

我的问题,是第一个if声明必要吗?它会导致我的左右子树遍历出现问题吗?最重要的是这种方法访问次数最少吗?

2 个答案:

答案 0 :(得分:0)

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

  

是的,第一个if语句是必要的。如果你解雇if   声明,您的程序将遇到访问a的一些运行时错误   空指针。

     

这基本上是左手第一次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);
                          //^^
}

答案 1 :(得分:0)

如果你有一个以简单的方式组织的树,那么你就不必制作一个if语句。

这实际上取决于你的树实现。

fororder tree的伪代码

-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             

按顺序意味着仅使用左时间叶子遍历每个节点

所以要找到范围之间的特定距离。实施Inorder查找 而不是执行最小值。并执行它只要你的实施 找到最大值的订单值

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

希望它可以帮助一点