Java 查找所有上下级节点

在开发过程中,我们经常需要在树形结构中查找某个节点的所有上下级节点。Java 提供了多种方法来实现这个功能,本文将介绍其中的两种常用的方法。

递归方式

递归是一种非常常用的解决树形结构问题的方法。通过递归,我们可以从根节点开始,逐层遍历子节点,直到找到目标节点为止。以下是一个使用递归方式查找所有上下级节点的示例代码:

public List<TreeNode> findAllNodes(TreeNode root, String target) {
    List<TreeNode> result = new ArrayList<>();
    findAllNodesHelper(root, target, result);
    return result;
}

private void findAllNodesHelper(TreeNode node, String target, List<TreeNode> result) {
    if (node == null) {
        return;
    }
    
    if (node.getValue().equals(target)) {
        result.add(node);
    }
    
    for (TreeNode child : node.getChildren()) {
        findAllNodesHelper(child, target, result);
    }
}

上述代码中,findAllNodes 方法接受一个根节点和一个目标值作为参数,并返回一个包含所有上下级节点的列表。findAllNodesHelper 方法是递归的辅助函数,它遍历当前节点的所有子节点,并将满足条件的节点添加到结果列表中。

使用递归方式查找所有上下级节点的优点是代码简洁,易于理解。但是,由于递归会占用大量的栈空间,当树的层级很深时,可能会导致栈溢出的问题。

迭代方式

迭代是另一种实现树形结构问题的方法。通过维护一个栈或队列,我们可以模拟递归的过程,遍历树的所有节点。以下是一个使用迭代方式查找所有上下级节点的示例代码:

public List<TreeNode> findAllNodes(TreeNode root, String target) {
    List<TreeNode> result = new ArrayList<>();
    Deque<TreeNode> stack = new ArrayDeque<>();
    stack.push(root);
    
    while (!stack.isEmpty()) {
        TreeNode node = stack.pop();
        
        if (node.getValue().equals(target)) {
            result.add(node);
        }
        
        for (TreeNode child : node.getChildren()) {
            stack.push(child);
        }
    }
    
    return result;
}

上述代码中,我们使用了一个栈 stack 来模拟递归过程。首先将根节点压入栈中,然后在循环中不断弹出栈顶节点,并将其子节点压入栈中,直到栈为空为止。如果栈顶节点的值与目标值相等,则将其添加到结果列表中。

使用迭代方式查找所有上下级节点的优点是可以节省栈空间,避免栈溢出的问题。但是,相比递归方式,迭代方式的代码复杂一些,需要手动维护栈或队列。

总结

通过递归或迭代的方式,我们可以很方便地查找树形结构中的所有上下级节点。递归方式代码简洁,易于理解,但可能存在栈溢出的问题;迭代方式可以节省栈空间,但代码复杂一些,需要手动维护栈或队列。根据实际情况选择适合的方式来实现树形结构的节点查找。

"递归是一种非常常用的解决树形结构问题的方法。通过递归,我们可以从根节点开始,逐层遍历子节点,直到找到目标节点为止。"

"使用递归方式查找所有上下级节点的优点是代码简洁,易于理解。但是,由于递归会占用大量的栈空间,当树的层级很深时,可能会导致栈溢出的问题。"

"迭代是另一种实现树形结构问题的方法。通过维护一个栈或队列,我们可以模拟递归的过程,遍历树的