忘了在哪里看到的题目了,有这样一种树形结构(如下图),用递归的方法查找是否存在某个节点。
网上找了很久,都是遍历子节点的,都不是我想要的答案,于是自己手动写了,想知道各位大佬还有没有其他方法。
上代码:
package com.founder.ipc.reconciliation.controller;
import java.util.ArrayList;
import java.util.List;
/**
* 递归查找是否存在某个树节点
* @author
* @date
*/
public class Test {
public static void main(String[] args) {
Test t = new Test();
TreeNode root = t.treeInit();
TreeNode tn = t.findById(root, "2-1");
System.out.println(tn == null ? "未找到" : "找到了~~~");
}
/**
* 递归查找某个节点
**/
private TreeNode findById(TreeNode treeNode, String id) {
if (null == treeNode) {
return null;
} else {
if (id.equals(treeNode.getId())) {
return treeNode;
} else {
List<TreeNode> childList = treeNode.getChild();
if (null != childList) {
for (TreeNode child : childList) {
TreeNode result = findById(child, id);
if (result != null) {
return result;
}
}
}
return null;
}
}
}
/**
* 树的初始化
**/
private TreeNode treeInit() {
TreeNode root = new TreeNode();
root.setId("root");
TreeNode child1 = new TreeNode();
child1.setId("1");
TreeNode child2 = new TreeNode();
child2.setId("2");
TreeNode child1_1 = new TreeNode();
child1_1.setId("1-1");
TreeNode child1_2 = new TreeNode();
child1_2.setId("1-2");
TreeNode child1_3 = new TreeNode();
child1_3.setId("1-3");
List<TreeNode> childs1_list = new ArrayList<>();
childs1_list.add(child1_1);
childs1_list.add(child1_2);
childs1_list.add(child1_3);
TreeNode child2_1 = new TreeNode();
child2_1.setId("2-1");
List<TreeNode> childs2_list = new ArrayList<>();
childs2_list.add(child2_1);
child1.setChild(childs1_list);
child2.setChild(childs2_list);
List<TreeNode> childsR_list = new ArrayList<>();
childsR_list.add(child1);
childsR_list.add(child2);
root.setChild(childsR_list);
return root;
}
/**
* 树节点的实体
**/
private class TreeNode {
private String id;
private List<TreeNode> child;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public List<TreeNode> getChild() {
return child;
}
public void setChild(List<TreeNode> child) {
this.child = child;
}
}
}
运行结果:
D:\MyJavaUtil\JDK8\bin\java.exe ...
找到了~~~
Process finished with exit code 0