Java 二叉树路径()的实现

Java 二叉树路径()的实现,java,binary-tree,Java,Binary Tree,我正在处理一个编程赋值,该赋值要求我们编写一个pathroot、value方法,该方法返回指向目标节点值的方向枚举(左、右)的LinkedList。我们不允许创建任何新字段来实现这一点,这就是我创建pathHelper方法的原因。我失败的一个测试应该返回:左,右作为路径,但它返回左,右,左,右。我不知道为什么要数两次台阶。如有任何建议,将不胜感激! 注意:这是一个二叉树,不是BST。我们应该使用穷举DFS方法 public static <T> LinkedList<B

我正在处理一个编程赋值,该赋值要求我们编写一个pathroot、value方法,该方法返回指向目标节点值的方向枚举(左、右)的LinkedList。我们不允许创建任何新字段来实现这一点,这就是我创建pathHelper方法的原因。我失败的一个测试应该返回:左,右作为路径,但它返回左,右,左,右。我不知道为什么要数两次台阶。如有任何建议,将不胜感激! 注意:这是一个二叉树,不是BST。我们应该使用穷举DFS方法

    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,请使用。这非常有用!非常感谢。我倾向于将代码过度复杂化。