返回
剖析面试题:多叉树遍历
前端
2023-10-08 00:26:31
前天面试遇到一个多叉树面试的题目,在这里分享记录一下。
题目:给你个 id,去拿到 name,多叉树遍历
解析:这道题首先是要明白多叉树的存储方式和遍历方式。
多叉树的存储方式有很多种,常见的有链表法、数组法和邻接表法。链表法使用链表来存储节点,每个节点包含一个数据域和一个指针域,指向其子节点。数组法使用数组来存储节点,每个数组元素存储一个节点的数据,而子节点的索引则存储在该节点的指针域中。邻接表法使用邻接表来存储节点,邻接表是一个数组,每个数组元素存储一个节点的数据,而子节点的索引则存储在该节点的邻接表中。
多叉树的遍历方式也有很多种,常见的有深度优先遍历和广度优先遍历。深度优先遍历从根节点开始,依次访问每个节点的所有子节点,再访问其兄弟节点,如此反复,直到访问完所有节点。广度优先遍历从根节点开始,依次访问每一层的所有节点,再访问下一层的节点,如此反复,直到访问完所有节点。
对于这道题,我们可以使用深度优先遍历或广度优先遍历来找到从给定的 id 到 name 的路径。这里我们使用深度优先遍历来解决这个问题。
public class MultiTree {
private Node root;
public MultiTree() {
this.root = null;
}
public void addNode(int id, String name) {
Node newNode = new Node(id, name);
if (root == null) {
root = newNode;
} else {
addNode(root, newNode);
}
}
private void addNode(Node parent, Node newNode) {
if (parent.getChildren() == null) {
parent.setChildren(new ArrayList<Node>());
}
parent.getChildren().add(newNode);
}
public String getNameById(int id) {
return getNameById(root, id);
}
private String getNameById(Node node, int id) {
if (node == null) {
return null;
}
if (node.getId() == id) {
return node.getName();
}
for (Node child : node.getChildren()) {
String name = getNameById(child, id);
if (name != null) {
return name;
}
}
return null;
}
public static void main(String[] args) {
MultiTree tree = new MultiTree();
tree.addNode(1, "root");
tree.addNode(2, "child1");
tree.addNode(3, "child2");
tree.addNode(4, "child3");
tree.addNode(5, "child4");
tree.addNode(6, "child5");
tree.addNode(7, "child6");
tree.addNode(8, "child7");
tree.addNode(9, "child8");
System.out.println(tree.getNameById(4)); // child3
System.out.println(tree.getNameById(7)); // child6
System.out.println(tree.getNameById(10)); // null
}
}
class Node {
private int id;
private String name;
private List<Node> children;
public Node(int id, String name) {
this.id = id;
this.name = name;
this.children = null;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this