Java 二叉树路径()的实现
我正在处理一个编程赋值,该赋值要求我们编写一个pathroot、value方法,该方法返回指向目标节点值的方向枚举(左、右)的LinkedList。我们不允许创建任何新字段来实现这一点,这就是我创建pathHelper方法的原因。我失败的一个测试应该返回:左,右作为路径,但它返回左,右,左,右。我不知道为什么要数两次台阶。如有任何建议,将不胜感激! 注意:这是一个二叉树,不是BST。我们应该使用穷举DFS方法Java 二叉树路径()的实现,java,binary-tree,Java,Binary Tree,我正在处理一个编程赋值,该赋值要求我们编写一个pathroot、value方法,该方法返回指向目标节点值的方向枚举(左、右)的LinkedList。我们不允许创建任何新字段来实现这一点,这就是我创建pathHelper方法的原因。我失败的一个测试应该返回:左,右作为路径,但它返回左,右,左,右。我不知道为什么要数两次台阶。如有任何建议,将不胜感激! 注意:这是一个二叉树,不是BST。我们应该使用穷举DFS方法 public static <T> LinkedList<B
public static <T> LinkedList<BinaryNode.Direction> path(BinaryNode<T> root, T value) {
if (root == null) {
return null;
} else if (root.payload == value) {
return new LinkedList<>();
}
LinkedList<BinaryNode.Direction> list = new LinkedList<>();
pathHelper(root, value, list);
return list;
}
public static <T> void pathHelper(BinaryNode<T> root, T value, LinkedList<BinaryNode.Direction> list) {
if (root.left != null) {
if (root.payload != value) {
list.add(BinaryNode.Direction.left);
}
pathHelper(root.left, value, list);
} if (root.right != null) {
if (root.payload != value) {
list.add(BinaryNode.Direction.right);
}
pathHelper(root.right, value, list);
}
}
您的代码中有很多错误,所以我很惊讶任何测试用例都能通过。您似乎在搜索树时存储方向,而不是在找到值时存储方向 我怀疑你把问题复杂化了。如果根据是否找到该项从帮助函数返回布尔值,则可以在从递归返回时轻松添加方向:
private boolean findPath(BinaryNode<T> node, T value, List<BinaryNode.Direction> directions) {
if (node == null) {
return false;
} else if (node.payload.equals(value)) {
return true;
} else if (findPath(node.left, value, directions)) {
directions.add(0, BinaryNode.Direction.LEFT);
return true;
} else if (findPath(node.right, value, directions)) {
directions.add(0, BinaryNode.Direction.RIGHT);
return true;
} else {
return false;
}
}
请注意,这将在列表的开头插入方向,以确保其顺序正确。这还允许您检测根在何处具有值,因为它将返回true,但路径将为空。无论给定值如何,您的pathHelper都会左右移动,因此它会首先遍历整个树深度。您只需要沿着路径走到目标值,就像您需要找到插入新值的位置时一样。使用==和!=使用对象可能最终会失败。改用equals方法。如果值可能为null或有效负载可能为null,请使用。这非常有用!非常感谢。我倾向于将代码过度复杂化。