| 
01 /*02  * Java Genetic Algorithm Library (jenetics-4.3.0).
 03  * Copyright (c) 2007-2018 Franz Wilhelmstötter
 04  *
 05  * Licensed under the Apache License, Version 2.0 (the "License");
 06  * you may not use this file except in compliance with the License.
 07  * You may obtain a copy of the License at
 08  *
 09  *      http://www.apache.org/licenses/LICENSE-2.0
 10  *
 11  * Unless required by applicable law or agreed to in writing, software
 12  * distributed under the License is distributed on an "AS IS" BASIS,
 13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 14  * See the License for the specific language governing permissions and
 15  * limitations under the License.
 16  *
 17  * Author:
 18  *    Franz Wilhelmstötter (franz.wilhelmstoetter@gmail.com)
 19  */
 20 package io.jenetics.ext.util;
 21
 22 import io.jenetics.util.ISeq;
 23
 24 /**
 25  * Tree specification, where the nodes of the whole tree are stored in an array.
 26  * The tree
 27  * <pre>
 28  * 0
 29  * ├── 1
 30  * │   ├── 4
 31  * │   └── 5
 32  * ├── 2
 33  * │   └── 6
 34  * └── 3
 35  *     ├── 7
 36  *     │   ├── 10
 37  *     │   └── 11
 38  *     ├── 8
 39  *     └── 9
 40  * </pre>
 41  * will be stored in breadth-first order and will look like this:
 42  * <pre>
 43  * ┌─┬───┐       ┌──────┬──┐
 44  * 0 1 2 3 4 5 6 7 8 9 10 11
 45  *   └─│─│─┴─┘ │ │   │
 46  *     └─│─────┘ │   │
 47  *       └───────┴───┘
 48  * </pre>
 49  * The child nodes are always stored on the right side of the parent flattenedNodes. So
 50  * you have to read the tree from left to right. All children of a parent node
 51  * are stored continuously after the {@code childOffset} and are defined by the
 52  * sub-array {@code [childOffset, childOffset + childCount)}.
 53  *
 54  * @author <a href="mailto:franz.wilhelmstoetter@gmail.com">Franz Wilhelmstötter</a>
 55  * @version 3.9
 56  * @since 3.9
 57  */
 58 public interface FlatTree<V, T extends FlatTree<V, T>> extends Tree<V, T> {
 59
 60     /**
 61      * Return the index of the first child node in the underlying node array.
 62      * {@code -1} is returned if {@code this} node is a leaf.
 63      *
 64      * @return Return the index of the first child node in the underlying node
 65      *         array, or {@code -1} if {@code this} node is a leaf
 66      */
 67     public int childOffset();
 68
 69     /**
 70      * Return the whole flattened tree values in breadth-first order. This is
 71      * equivalent to
 72      * <pre>{@code
 73      * final ISeq<T> seq = getRoot().breadthFirstStream()
 74      *     .collect(ISeq.toISeq());
 75      * }</pre>
 76      *
 77      * @return the flattened tree values in breadth-first order
 78      */
 79     public default ISeq<T> flattenedNodes() {
 80         return getRoot().breadthFirstStream().collect(ISeq.toISeq());
 81     }
 82
 83 }
 |