- All Known Implementing Classes:
AbstractTreeGene
,FlatTreeNode
,TreeNode
TreeNode
class.- Since:
- 3.9
- Version:
- 7.0
- See Also:
-
Nested Class Summary
Modifier and TypeInterfaceDescriptionstatic final class
This class represents the path to child within a given tree. -
Method Summary
Modifier and TypeMethodDescriptionReturn an iterator that traverses the subtree rooted atthis
node in breadth-first order.Return a stream that traverses the subtree rooted atthis
node in breadth-first order.childAfter
(Tree<?, ?> child) Return the child which comes immediately afterthis
node.childAt
(int index) Return the child node with the given index.childAtPath
(int... path) Return the child node at the givenpath
.childAtPath
(Tree.Path path) Return the child node at the givenpath
.childBefore
(Tree<?, ?> child) Return the child which comes immediately beforethis
node.int
Return the number of children this tree node consists of.Return an iterator of the children of thisTree
node.default Tree.Path
Return the path ofthis
child node from the root node.Return a forward-order stream of this node's children.default int
depth()
Returns the depth of the tree rooted at this node.Return an iterator that traverses the subtree rooted atthis
node in depth-first order.Return a stream that traverses the subtree rooted atthis
node in depth-first.static boolean
Checks if the two given trees has the same structure with the same values.Return the first child ofthis
node, orOptional.empty()
ifthis
node has no children.default T
Return the first leaf that is a descendant ofthis
node; either this node or its first child's first leaf.static int
Calculates the hash code of the given tree.default boolean
Tests whetherthis
node is the same as theother
node.default int
Returns the index of the specified child in this node's child array, or-1
ifthis
node doesn't contain the givenchild
.default boolean
isAncestor
(Tree<?, ?> node) Returntrue
if the givennode
is an ancestor ofthis
node.default boolean
Returntrue
if the givennode
is a child ofthis
node.default boolean
isDescendant
(Tree<?, ?> node) Returntrue
if the givennode
is a descendant ofthis
node.default boolean
isEmpty()
A tree is considered empty if it'svalue()
isnull
and has no children and parent.default boolean
isLeaf()
Returntrue
ifthis
node has no children.default boolean
Returns true if and only if the givennode
is in the same tree asthis
node.default boolean
isRoot()
Returnstrue
if this node is the root of the tree.default boolean
Test if the givennode
is a sibling ofthis
node.iterator()
Return an iterator that traverses the subtree rooted atthis
.Return the last child ofthis
node, orOptional.empty()
ifthis
node has no children.default T
lastLeaf()
Return the last leaf that is a descendant of this node; eitherthis
node or its last child's last leaf.default int
Returns the total number of leaves that are descendants of this node.leaves()
Return a stream of leaves that are descendants of this node.default int
level()
Returns the number of levels above this node.nextLeaf()
Returns the leaf afterthis
node orOptional.empty()
if this node is the last leaf in the tree.nextNode()
Return the node that followsthis
node in a pre-order traversal ofthis
tree node.Return the next sibling ofthis
node in the parent's children array, ornull
ifthis
node has no parent, or it is the last child of the paren.parent()
Return the parent node of this tree node.default Tree.Path
path()
Return theTree.Path
ofthis
tree, such thatfinal Tree<Integer, ?> tree = ...; final Tree.Path path = tree.path(); assert tree == tree.getRoot() .childAtPath(path) .orElse(null);
Returns the path from the root, to get to this node.pathFromAncestorIterator
(Tree<?, ?> ancestor) Return an iterator that follows the path fromancestor
tothis
node.Return an iterator that traverses the subtree rooted atthis
node in post-order.Return a stream that traverses the subtree rooted atthis
node in post-order.Return an iterator that traverses the subtree rooted atthis
node in pre-order.Return a stream that traverses the subtree rooted atthis
node in pre-order.Return the leaf beforethis
node ornull
ifthis
node is the first leaf in the tree.Return the node that precedes this node in a pre-order traversal ofthis
tree node.Return the previous sibling ofthis
node in the parent's children list, orOptional.empty()
if this node has no parent or is the parent's first child.default <U> U
reduce
(U[] neutral, BiFunction<? super V, ? super U[], ? extends U> reducer) Performs a reduction on the elements ofthis
tree, using an associative reduction function.default T
root()
Returns the root of the tree that contains this node.sharedAncestor
(T node) Returns the nearest common ancestor to this node and the givennode
.default int
Return the number of siblings ofthis
node.default int
size()
Return the number of nodes ofthis
node (subtree).stream()
Return a stream that traverses the subtree rooted atthis
node in breadth-first order.default String
Return a compact string representation of the given tree.default String
toParenthesesString
(Function<? super V, String> mapper) Return a compact string representation of the given tree.static String
Return a string representation of the given tree, like the following example.value()
Return the value of the currentTree
node.Methods inherited from interface java.lang.Iterable
forEach, spliterator
-
Method Details
-
value
Return the value of the currentTree
node. The value may benull
.- Returns:
- the value of the current
Tree
node
-
parent
Return the parent node of this tree node.- Returns:
- the parent node, or
Optional.empty()
if this node is the root of the tree
-
childAt
Return the child node with the given index.- Parameters:
index
- the child index- Returns:
- the child node with the given index
- Throws:
IndexOutOfBoundsException
- if theindex
is out of bounds ([0, childCount())
)
-
childCount
int childCount()Return the number of children this tree node consists of.- Returns:
- the number of children this tree node consists of
-
childIterator
Return an iterator of the children of thisTree
node.- Returns:
- an iterator of the children of this
Tree
node.
-
childStream
Return a forward-order stream of this node's children.- Returns:
- a stream of children of
this
node
-
isRoot
Returnstrue
if this node is the root of the tree.- Returns:
true
if this node is the root of its tree,false
otherwise
-
depth
Returns the depth of the tree rooted at this node. The depth of a tree is the longest distance fromthis
node to a leaf. Ifthis
node has no children, 0 is returned. This operation is much more expensive thanlevel()
because it must effectively traverse the entire tree rooted atthis
node.- Returns:
- the depth of the tree whose root is this node
-
level
Returns the number of levels above this node. The level of a tree is the distance from the root tothis
node. Ifthis
node is the root, returns 0.- Returns:
- the number of levels above this node
-
indexOf
Returns the index of the specified child in this node's child array, or-1
ifthis
node doesn't contain the givenchild
. This method performs a linear search and is O(n) wheren
is the number of children.- Parameters:
child
- the TreeNode to search for among this node's children- Returns:
- the index of the node in this node's child array, or
-1
if the node could not be found - Throws:
NullPointerException
- if the givenchild
isnull
-
size
Return the number of nodes ofthis
node (subtree).- Returns:
- the number of nodes of
this
node (subtree)
-
isEmpty
A tree is considered empty if it'svalue()
isnull
and has no children and parent. A newly created tree node with no value is empty.final Tree<String, ?> tree = TreeNode.of(); assert tree.isEmpty();
- Returns:
true
ifthis
tree is empty,false
otherwise- Since:
- 7.0
-
childAtPath
Return the child node at the givenpath
. A path consists of the child index at a give level, starting with level 1. (The root note has level zero.)tree.childAtPath(Path.of(2))
will return the third child node ofthis
node, if it exists andtree.childAtPath(Path.of(2, 0))
will return the first child of the third child ofthis node
.- Parameters:
path
- the child path- Returns:
- the child node at the given
path
- Throws:
NullPointerException
- if the givenpath
array isnull
- Since:
- 4.4
- See Also:
-
childAtPath
Return the child node at the givenpath
. A path consists of the child index at a give level, starting with level 1. (The root note has level zero.)tree.childAtPath(2)
will return the third child node ofthis
node, if it exists andtree.childAtPath(2, 0)
will return the first child of the third child ofthis node
.- Parameters:
path
- the child path- Returns:
- the child node at the given
path
- Throws:
NullPointerException
- if the givenpath
array isnull
IllegalArgumentException
- if one of the path elements is smaller than zero- Since:
- 4.3
- See Also:
-
isAncestor
Returntrue
if the givennode
is an ancestor ofthis
node. This operation is at worstO(h)
whereh
is the distance from the root tothis
node.- Parameters:
node
- the node to test- Returns:
true
if the givennode
is an ancestor ofthis
node,false
otherwise- Throws:
NullPointerException
- if the givennode
isnull
-
isDescendant
Returntrue
if the givennode
is a descendant ofthis
node. If the givennode
isnull
,false
is returned. This operation is at worstO(h)
whereh
is the distance from the root tothis
node.- Parameters:
node
- the node to test as descendant of this node- Returns:
true
if this node is an ancestor of the givennode
- Throws:
NullPointerException
- if the givennode
isnull
-
isRelated
Returns true if and only if the givennode
is in the same tree asthis
node.- Parameters:
node
- the other node to check- Returns:
- true if the given
node
is in the same tree asthis
node,false
otherwise. - Throws:
NullPointerException
- if the givennode
isnull
-
pathElements
Returns the path from the root, to get to this node. The last element in the path is this node.- Returns:
- an array of TreeNode objects giving the path, where the first element in the path is the root and the last element is this node.
- Since:
- 5.1
-
path
Return theTree.Path
ofthis
tree, such thatfinal Tree<Integer, ?> tree = ...; final Tree.Path path = tree.path(); assert tree == tree.getRoot() .childAtPath(path) .orElse(null);
- Returns:
- the path from the root element to
this
node. - Since:
- 5.1
-
root
Returns the root of the tree that contains this node. The root is the ancestor with no parent.- Returns:
- the root of the tree that contains this node
-
isChild
Returntrue
if the givennode
is a child ofthis
node.- Parameters:
node
- the other node to check- Returns:
true
ifnode
is a child,false
otherwise- Throws:
NullPointerException
- if the givennode
isnull
-
firstChild
Return the first child ofthis
node, orOptional.empty()
ifthis
node has no children.- Returns:
- the first child of this node
-
lastChild
Return the last child ofthis
node, orOptional.empty()
ifthis
node has no children.- Returns:
- the last child of this node
-
childAfter
Return the child which comes immediately afterthis
node. This method performs a linear search of this node's children forchild
and isO(n)
where n is the number of children.- Parameters:
child
- the child node- Returns:
- the child of this node that immediately follows the
child
, orOptional.empty()
if the givennode
is the first node. - Throws:
NullPointerException
- if the givenchild
isnull
-
childBefore
Return the child which comes immediately beforethis
node. This method performs a linear search of this node's children forchild
and isO(n)
where n is the number of children.- Parameters:
child
- the child node- Returns:
- the child of this node that immediately precedes the
child
, ornull
if the givennode
is the first node. - Throws:
NullPointerException
- if the givenchild
isnull
-
nextNode
Return the node that followsthis
node in a pre-order traversal ofthis
tree node. ReturnOptional.empty()
if this node is the last node of the traversal. This is an inefficient way to traverse the entire tree use an iterator instead.- Returns:
- the node that follows this node in a pre-order traversal, or
Optional.empty()
if this node is last - See Also:
-
previousNode
Return the node that precedes this node in a pre-order traversal ofthis
tree node. ReturnsOptional.empty()
if this node is the first node of the traversal, the root of the tree. This is an inefficient way to traverse the entire tree; use an iterator instead.- Returns:
- the node that precedes this node in a pre-order traversal, or
Optional.empty()
if this node is the first - See Also:
-
isSibling
Test if the givennode
is a sibling ofthis
node.- Parameters:
node
- node to test as sibling of this node- Returns:
true
if thenode
is a sibling ofthis
node- Throws:
NullPointerException
- if the givennode
isnull
-
siblingCount
Return the number of siblings ofthis
node. A node is its own sibling (if it has no parent or no siblings, this method returns1
).- Returns:
- the number of siblings of
this
node
-
nextSibling
Return the next sibling ofthis
node in the parent's children array, ornull
ifthis
node has no parent, or it is the last child of the paren. This method performs a linear search that isO(n)
where n is the number of children; to traverse the entire array, use the iterator of the parent instead.- Returns:
- the sibling of
this
node that immediately followsthis
node - See Also:
-
previousSibling
Return the previous sibling ofthis
node in the parent's children list, orOptional.empty()
if this node has no parent or is the parent's first child. This method performs a linear search that is O(n) where n is the number of children.- Returns:
- the sibling of
this
node that immediately precedes this node
-
isLeaf
Returntrue
ifthis
node has no children.- Returns:
true
ifthis
node has no children,false
otherwise
-
firstLeaf
Return the first leaf that is a descendant ofthis
node; either this node or its first child's first leaf.this
node is returned if it is a leaf.- Returns:
- the first leaf in the subtree rooted at this node
- See Also:
-
lastLeaf
Return the last leaf that is a descendant of this node; eitherthis
node or its last child's last leaf. Returnsthis
node if it is a leaf.- Returns:
- the last leaf in this subtree
- See Also:
-
nextLeaf
Returns the leaf afterthis
node orOptional.empty()
if this node is the last leaf in the tree.In order to determine the next node, this method first performs a linear search in the parent's child-list in order to find the current node.
That implementation makes the operation suitable for short traversals from a known position. But to traverse all the leaves in the tree, you should use
depthFirstIterator()
to iterator the nodes in the tree and useisLeaf()
on each node to determine which are leaves.- Returns:
- return the next leaf past this node
- See Also:
-
previousLeaf
Return the leaf beforethis
node ornull
ifthis
node is the first leaf in the tree.In order to determine the previous node, this method first performs a linear search in the parent's child-list in order to find the current node.
That implementation makes the operation suitable for short traversals from a known position. But to traverse all the leaves in the tree, you should use
depthFirstIterator()
to iterate the nodes in the tree and useisLeaf()
on each node to determine which are leaves.- Returns:
- returns the leaf before
this
node - See Also:
-
leafCount
Returns the total number of leaves that are descendants of this node. If this node is a leaf, returns1
. This method isO(n)
, where n is the number of descendants ofthis
node.- Returns:
- the number of leaves beneath this node
- See Also:
-
leaves
Return a stream of leaves that are descendants of this node.- Returns:
- a stream of leaves that are descendants of this node
- Since:
- 7.0
-
breadthFirstIterator
Return an iterator that traverses the subtree rooted atthis
node in breadth-first order. The first node returned by the iterator isthis
node.Modifying the tree by inserting, removing, or moving a node invalidates any iterator created before the modification.
- Returns:
- an iterator for traversing the tree in breadth-first order
- See Also:
-
iterator
Return an iterator that traverses the subtree rooted atthis
. The first node returned by the iterator isthis
node.Modifying the tree by inserting, removing, or moving a node invalidates any iterator created before the modification.
-
breadthFirstStream
Return a stream that traverses the subtree rooted atthis
node in breadth-first order. The first node returned by the stream isthis
node.- Returns:
- a stream for traversing the tree in breadth-first order
- See Also:
-
stream
Return a stream that traverses the subtree rooted atthis
node in breadth-first order. The first node returned by the stream isthis
node.- Returns:
- a stream for traversing the tree in breadth-first order
- See Also:
-
preorderIterator
Return an iterator that traverses the subtree rooted atthis
node in pre-order. The first node returned by the iterator isthis
node.Modifying the tree by inserting, removing, or moving a node invalidates any iterator created before the modification.
- Returns:
- an iterator for traversing the tree in pre-order
- See Also:
-
preorderStream
Return a stream that traverses the subtree rooted atthis
node in pre-order. The first node returned by the stream isthis
node.Modifying the tree by inserting, removing, or moving a node invalidates any iterator created before the modification.
- Returns:
- a stream for traversing the tree in pre-order
- See Also:
-
postorderIterator
Return an iterator that traverses the subtree rooted atthis
node in post-order. The first node returned by the iterator is the leftmost leaf. This is the same as a depth-first traversal.- Returns:
- an iterator for traversing the tree in post-order
- See Also:
-
postorderStream
Return a stream that traverses the subtree rooted atthis
node in post-order. The first node returned by the iterator is the leftmost leaf. This is the same as a depth-first traversal.- Returns:
- a stream for traversing the tree in post-order
- See Also:
-
depthFirstIterator
Return an iterator that traverses the subtree rooted atthis
node in depth-first order. The first node returned by the iterator is the leftmost leaf. This is the same as a postorder traversal.Modifying the tree by inserting, removing, or moving a node invalidates any iterator created before the modification.
- Returns:
- an iterator for traversing the tree in depth-first order
- See Also:
-
depthFirstStream
Return a stream that traverses the subtree rooted atthis
node in depth-first. The first node returned by the iterator is the leftmost leaf. This is the same as a post-order traversal.- Returns:
- a stream for traversing the tree in post-order
- See Also:
-
pathFromAncestorIterator
Return an iterator that follows the path fromancestor
tothis
node. The iterator returnancestor
as a first element, The creation of the iterator is O(m), where m is the number of nodes betweenthis
node and theancestor
, inclusive.Modifying the tree by inserting, removing, or moving a node invalidates any iterator created before the modification.
- Parameters:
ancestor
- the ancestor node- Returns:
- an iterator for following the path from an ancestor of
this
node to this one - Throws:
IllegalArgumentException
- if theancestor
is not an ancestor of this nodeNullPointerException
- if the givenancestor
isnull
- See Also:
-
childPath
Return the path ofthis
child node from the root node. You will getthis
node, if you callchildAtPath(Path)
on the root node ofthis
node.final Tree<?, ?> node = ...; final Tree<?, ?> root = node.getRoot(); final int[] path = node.childPath(); assert node == root.childAtPath(path);
- Returns:
- the path of
this
child node from the root node. - Since:
- 4.4
- See Also:
-
identical
Tests whetherthis
node is the same as theother
node. The default implementation returns the object identity,this == other
, of the two objects, but other implementations may use different criteria for checking the identity.- Parameters:
other
- theother
node- Returns:
true
if theother
node is the same asthis
node.
-
reduce
Performs a reduction on the elements ofthis
tree, using an associative reduction function. This can be used for evaluating a given expression tree in pre-order.final Tree<String, ?> formula = TreeNode.parse("add(sub(6,div(230,10)),mul(5,6))"); final double result = formula.reduce(new Double[0], (op, args) -> switch (op) { case "add" -> args[0] + args[1]; case "sub" -> args[0] - args[1]; case "mul" -> args[0] * args[1]; case "div" -> args[0] / args[1]; default -> Double.parseDouble(op); } ); assert result == 13.0;
- Type Parameters:
U
- the result type- Parameters:
neutral
- the neutral element of the reduction. In most cases this will benew U[0]
.reducer
- the reduce function- Returns:
- the result of the reduction, or
null
ifthis
tree is empty (isEmpty() == true
) - Since:
- 7.1
-
toParenthesesString
Return a compact string representation of the given tree. The treemul ├── div │ ├── cos │ │ └── 1.0 │ └── cos │ └── π └── sin └── mul ├── 1.0 └── z
is printed asmul(div(cos(1.0),cos(π)),sin(mul(1.0,z)))
- Parameters:
mapper
- themapper
which converts the tree value to a string- Returns:
- the string representation of the given tree
- Since:
- 4.3
- See Also:
-
toParenthesesString
Return a compact string representation of the given tree. The treemul ├── div │ ├── cos │ │ └── 1.0 │ └── cos │ └── π └── sin └── mul ├── 1.0 └── z
is printed asmul(div(cos(1.0), cos(π)), sin(mul(1.0, z)))
- Returns:
- the string representation of the given tree
- Throws:
NullPointerException
- if themapper
isnull
- Since:
- 4.3
- See Also:
-
hashCode
Calculates the hash code of the given tree.- Parameters:
tree
- the tree where the hash is calculated from- Returns:
- the hash code of the tree
- Throws:
NullPointerException
- if the giventree
isnull
-
equals
Checks if the two given trees has the same structure with the same values.- Parameters:
a
- the first treeb
- the second tree- Returns:
true
if the two given trees are structurally equals,false
otherwise
-
toString
Return a string representation of the given tree, like the following example.mul(div(cos(1.0), cos(π)), sin(mul(1.0, z)))
This method is intended to be used when override theObject.toString()
method.- Parameters:
tree
- the input tree- Returns:
- the string representation of the given tree
-