在Tree中查找从leaf到root的路径

时间:2013-11-07 12:48:51

标签: java

我看到很多关于树的例子以及如何递归搜索它们,但不像我的情况。所以我决定问。

如何找到从任何叶子到根的路径?

我的问题是每个父母有很多子节点。以下是我的代码示例:

 private LinkedList<TreeNode> findPath(LinkedList<TreeNode> path, TreeNode root, TreeNode leaf){
    if(root == null || root.name==null) return null;

    path.add(root);

    if(root.name.equals(leaf.name))
        return path;

    //Check if the leaf that we are looking for is one of the root children
    if(root.children==null) return null;
    for(TreeNode children : root.children){
        if(children.name.equals(leaf.name)){
            path.add(children);
            return path;
        }
    }
    //Search in all the childrens of the root recursively
    for(TreeNode children : root.children){
        LinkedList<TreeNode> result =  findPath(path, children, leaf);
        if(result != null)
            return result;
    }

    //The leaf is not found. 
    return null;
}

问题在于,每当我检查一个孩子时,如果我在那里找不到我的叶子,我会收回但是我已经在路径中添加了子节点,我的路径变得非常大。

1 个答案:

答案 0 :(得分:2)

此实现假定每个树节点都知道&#39;它的父母:

private List<TreeNode> findPath(TreeNode root, TreeNode leaf) {
    List<TreeNode> path = new ArrayList<>();
    TreeNode node = leaf;
    do {
        path.add(node);
        node = node.getParent();
    } while (node != root);

    return path;
}

当然,你应该为root和leaf添加有效性检查,并且如果一个节点(直接或间接地)是它自己的父节点,就会想到无限循环的可能性。

如果您的树节点只包含其子节点,但子节点不知道&#39;它的父级(如果你拥有树节点的代码,你可能应该改变它),它变得越来越复杂,因为树必须递归搜索:

public static List<TreeNode> findPath(TreeNode root, TreeNode leaf) {
    LinkedList<TreeNode> path = new LinkedList<>();
    findPathHelper(root, leaf, path);
    return path;
}

private static boolean findPathHelper(TreeNode root, TreeNode leaf, List<TreeNode> path) {
    if (root == leaf) {
        path.add(root);
        return true;
    }

    for (TreeNode treeNode : root.children) {
        if (findPathHelper(treeNode, leaf, path)) {
            path.add(root);
            return true;
        }
    }
    return false;
}