返回

剖析面试题:多叉树遍历

前端

前天面试遇到一个多叉树面试的题目,在这里分享记录一下。

题目:给你个 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