Java中树的存储结构实现(3)

// 以指定根节点、指定treeSize创建树
    public TreeChild(E data, int treeSize) {
        this.treeSize = treeSize;
        nodes = new Node[treeSize];
        nodes[0] = new Node<E>(data);
        nodeNums++;
    }

// 为指定节点添加子节点
    public void addNode(E data, Node parent) {
        for (int i = 0; i < treeSize; i++) {
            // 找到数组中第一个为null的元素,该元素保存新节点
            if (nodes[i] == null) {
                // 创建新节点,并用指定数组元素保存它
                nodes[i] = new Node(data);
                if (parent.first == null) {
                    parent.first = new SonNode(i, null);
                } else {
                    SonNode next = parent.first;
                    while (next.next != null) {
                        next = next.next;
                    }
                    next.next = new SonNode(i, null);
                }
                nodeNums++;
                return;
            }
        }
        throw new RuntimeException("该树已满,无法添加新节点");
    }

// 判断树是否为空
    public boolean empty() {
        // 根结点是否为null
        return nodes[0] == null;
    }

// 返回根节点
    public Node<E> root() {
        // 返回根节点
        return nodes[0];
    }

// 返回指定节点(非叶子节点)的所有子节点
    public List<Node<E>> children(Node parent) {

List<Node<E>> list = new ArrayList<Node<E>>();
        // 获取parent节点的第一个子节点
        SonNode next = parent.first;
        // 沿着孩子链不断搜索下一个孩子节点
        while (next != null) {
            // 添加孩子链中的节点
            list.add(nodes[next.pos]);
            next = next.next;
        }
        return list;

}

// 返回指定节点(非叶子节点)的第index个子节点
    public Node<E> child(Node parent, int index) {
        // 获取parent节点的第一个子节点
        SonNode next = parent.first;
        // 沿着孩子链不断搜索下一个孩子节点
        for (int i = 0; next != null; i++) {
            if (index == i) {
                return nodes[next.pos];
            }
            next = next.next;
        }
        return null;
    }

// 返回该树的深度
    public int deep() {
        // 获取该树的深度
        return deep(root());
    }

// 这是一个递归方法:每棵子树的深度为其所有子树的最大深度 + 1
    private int deep(Node node) {
        if (node.first == null) {
            return 1;
        } else {
            // 记录其所有子树的最大深度
            int max = 0;
            SonNode next = node.first;
            // 沿着孩子链不断搜索下一个孩子节点
            while (next != null) {
                // 获取以其子节点为根的子树的深度
                int tmp = deep(nodes[next.pos]);
                if (tmp > max) {
                    max = tmp;
                }
                next = next.next;
            }
            // 最后,返回其所有子树的最大深度 + 1
            return max + 1;
        }
    }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/20b33c3dc305f42e978657eebf7e9b1a.html