001/* 002 * Java Genetic Algorithm Library (jenetics-7.2.0). 003 * Copyright (c) 2007-2023 Franz Wilhelmstötter 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 * 017 * Author: 018 * Franz Wilhelmstötter (franz.wilhelmstoetter@gmail.com) 019 */ 020package io.jenetics.ext.util; 021 022import io.jenetics.util.ISeq; 023 024/** 025 * Tree specification, where the nodes of the whole tree are stored in an array. 026 * The tree 027 * <pre> 028 * 0 029 * ├── 1 030 * │ ├── 4 031 * │ └── 5 032 * ├── 2 033 * │ └── 6 034 * └── 3 035 * ├── 7 036 * │ ├── 10 037 * │ └── 11 038 * ├── 8 039 * └── 9 040 * </pre> 041 * will be stored in breadth-first order and will look like this: 042 * <pre> 043 * ┌─┬─┬─┐ ┌──────┬──┐ 044 * 0 1 2 3 4 5 6 7 8 9 10 11 045 * └─│─│─┴─┘ │ │ │ │ 046 * └─│─────┘ │ │ │ 047 * └───────┴─┴─┘ 048 * </pre> 049 * The child nodes are always stored on the right side of the parent flattened 050 * Nodes. So you have to read the tree from left to right. All children of a 051 * parent node are stored continuously after the {@code childOffset} and are 052 * defined by the sub-array {@code [childOffset, childOffset + childCount)}. 053 * 054 * @author <a href="mailto:franz.wilhelmstoetter@gmail.com">Franz Wilhelmstötter</a> 055 * @version 3.9 056 * @since 3.9 057 */ 058public interface FlatTree<V, T extends FlatTree<V, T>> extends Tree<V, T> { 059 060 /** 061 * Return the index of the first child node in the underlying node array. 062 * {@code -1} is returned if {@code this} node is a leaf. 063 * 064 * @return Return the index of the first child node in the underlying node 065 * array, or {@code -1} if {@code this} node is a leaf 066 */ 067 int childOffset(); 068 069 /** 070 * Return the whole flattened tree values in breadth-first order. This is 071 * equivalent to 072 * <pre>{@code 073 * final ISeq<T> seq = getRoot().breadthFirstStream() 074 * .collect(ISeq.toISeq()); 075 * }</pre> 076 * 077 * @return the flattened tree values in breadth-first order 078 */ 079 default ISeq<T> flattenedNodes() { 080 return root().breadthFirstStream().collect(ISeq.toISeq()); 081 } 082 083}