问题(必须递归): 编写一个获取二叉树的根,最小值和最大值的函数,并查找树中位于这些值之间的所有节点,并尽可能访问其他节点
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声明必要吗?它会导致我的左右子树遍历出现问题吗?最重要的是这种方法访问次数最少吗?
答案 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查找 而不是执行最小值。并执行它只要你的实施 找到最大值的订单值
但是尝试保存此过程的结果以获得您想要的序列。
希望它可以帮助一点