我看到很多关于树的例子以及如何递归搜索它们,但不像我的情况。所以我决定问。
如何找到从任何叶子到根的路径?
我的问题是每个父母有很多子节点。以下是我的代码示例:
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;
}
问题在于,每当我检查一个孩子时,如果我在那里找不到我的叶子,我会收回但是我已经在路径中添加了子节点,我的路径变得非常大。
答案 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;
}