关于面试的树结构简单实现

我们面试的时候,会遇到这样的笔试题目: 如下面的数据 

 1 1 1 1 1 

 2 1 2 2 2

3   1 3 3 3

4 2 4 4 4

5 3 5 5 5

让你简单的设计一下,实现树结构 

其实也就是 id 和 pid 的问题,多的不说,直接上代码,

哈哈,拙见,有不足之处请大家指出:

首先是一个测试类(也是一个实体类)保存你的数据(可以是从数据库中查出来的数据),我简单的设置了几个字段,如有需要可自己根据实际情况而定

public class Test {
private String id;
private String pid;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

}

然后是一个为了构造树的一个实体类 ;

稍微解释一下,里面的children 字段,主要是保存这个对象的孩子的(哈哈,习惯这样说)也就是他的子节点;

public class TestTree {

private String id;
public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getPid() {
return pid;
}

public void setPid(String pid) {
this.pid = pid;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public List<TestTree> getChildren() {
return Children;
}

public void setChildren(List<TestTree> children) {
Children = children;
}

private String pid;
private String name;
private List<TestTree> Children;

public TestTree() {
Children = new ArrayList<TestTree>();
}

@Override
public String toString() {
return "TestTree [id=" + id + ", pid=" + pid + ", name=" + name + ", Children=" + Children + "]";
}

}

再然后就是为了构造这个树的方法了,方法很简单,还有一些别的更好的方法,这里就不做了,献上我自己的拙见:

这个方法也很简单,首先是有一个根,然后把你的数据放到一个map集合里面去,主要是下面的放孩子进去,也是遍历你的数据

当它没有pid的时候它就是一个根节点,有pid 的时候,就把它对应的数据放到孩子里面去

public class RunTree {

public List<TestTree> doBuild(List<Test> data) {
List<TestTree> nodes = new ArrayList<TestTree>();

TestTree testTree = new TestTree();
testTree.setId("1");
testTree.setName("根");
nodes.add(testTree);

Map<String,Object> map = new HashMap<>();
//加载节点
for (Test model:data) {
TestTree treeone = new TestTree();

treeone.setId(model.getId());
if (model.getPid() != null && model.getPid() != "") {
treeone.setPid(model.getPid());
}

treeone.setName(model.getName());

map.put(model.getId(), treeone);

}
//放孩子进去
for (Test model:data) {
String id = model.getId();
String pid = model.getPid();

if (pid.equals(null) || pid.equals("")) {
testTree.getChildren().add((TestTree)map.get(id));
}else {
TestTree treetwo = new TestTree();

treetwo =(TestTree)map.get(pid);
if (treetwo != null) {
treetwo.getChildren().add((TestTree)map.get(id));
}

}



}

return nodes;
}
}

下面再来一个小小的测试:

public class TestMain {

public static void main(String[] args) {
Test t = new Test();
t.setId("1");
t.setName("1");
t.setPid("");

Test t1 = new Test();
t1.setId("2");
t1.setName("2");
t1.setPid("1");

Test t2 = new Test();
t2.setId("3");
t2.setName("3");
t2.setPid("2");


List<Test> list = new ArrayList<>();

list.add(t2);
list.add(t1);
list.add(t);


RunTree run = new RunTree();

List<TestTree> result = run.doBuild(list);

System.out.println(result.toString());
}

}

好了,大致就是这样,希望对你有所帮助

猜你喜欢

转载自www.cnblogs.com/lmtdb/p/9758754.html