@@ -73,4 +73,77 @@ fn initialize_from_table_collection() {
73
73
// _tree is a tskit::Tree
74
74
}
75
75
// ANCHOR_END: iterate_trees
76
+
77
+ let mut tree_iterator = treeseq. tree_iterator ( TreeFlags :: default ( ) ) . unwrap ( ) ;
78
+ // ANCHOR: iterate_node_siblings
79
+ // This is an enum defining supported
80
+ // traversal orders through a Tree.
81
+ use tskit:: NodeTraversalOrder ;
82
+ while let Some ( tree) = tree_iterator. next ( ) {
83
+ for node in tree. traverse_nodes ( NodeTraversalOrder :: Preorder ) {
84
+ if let Some ( parent) = tree. parent ( node) {
85
+ // Collect the siblings of node into a Vec
86
+ // The children function returns another iterator
87
+ let _siblings = if let Some ( child_iterator) = tree. children ( parent) {
88
+ child_iterator
89
+ . filter ( |child| child != & node)
90
+ . collect :: < Vec < _ > > ( )
91
+ } else {
92
+ // assign empty vector
93
+ vec ! [ ]
94
+ } ;
95
+ }
96
+ }
97
+ }
98
+ // ANCHOR_END: iterate_node_siblings
99
+
100
+ let mut tree_iterator = treeseq. tree_iterator ( TreeFlags :: default ( ) ) . unwrap ( ) ;
101
+ // ANCHOR: iterate_node_siblings_via_arrays
102
+ while let Some ( tree) = tree_iterator. next ( ) {
103
+ let parents = tree. parent_array ( ) ;
104
+ let rsibs = tree. right_sib_array ( ) ;
105
+ let lchildren = tree. left_child_array ( ) ;
106
+ for node in tree. traverse_nodes ( NodeTraversalOrder :: Preorder ) {
107
+ let mut siblings = vec ! [ ] ;
108
+ assert ! ( !node. is_null( ) ) ;
109
+ if let Some ( parent) = parents. get ( usize:: try_from ( node) . unwrap ( ) ) {
110
+ if !parent. is_null ( ) {
111
+ if let Some ( child) = lchildren. get ( usize:: try_from ( * parent) . unwrap ( ) ) {
112
+ let mut u = * child;
113
+ while !u. is_null ( ) {
114
+ if u != node {
115
+ siblings. push ( u) ;
116
+ }
117
+ if let Some ( sib) = rsibs. get ( usize:: try_from ( u) . unwrap ( ) ) {
118
+ u = * sib;
119
+ }
120
+ }
121
+ }
122
+ }
123
+ }
124
+ }
125
+ }
126
+ // ANCHOR_END: iterate_node_siblings_via_arrays
127
+
128
+ let mut tree_iterator = treeseq. tree_iterator ( TreeFlags :: default ( ) ) . unwrap ( ) ;
129
+ // ANCHOR: iterate_node_siblings_via_array_getters
130
+ while let Some ( tree) = tree_iterator. next ( ) {
131
+ for node in tree. traverse_nodes ( NodeTraversalOrder :: Preorder ) {
132
+ let mut siblings = vec ! [ ] ;
133
+ if let Some ( parent) = tree. parent ( node) {
134
+ if let Some ( child) = tree. left_child ( parent) {
135
+ let mut u = child;
136
+ while !u. is_null ( ) {
137
+ if u != node {
138
+ siblings. push ( u) ;
139
+ }
140
+ if let Some ( sib) = tree. right_sib ( u) {
141
+ u = sib;
142
+ }
143
+ }
144
+ }
145
+ }
146
+ }
147
+ }
148
+ // ANCHOR_END: iterate_node_siblings_via_array_getters
76
149
}
0 commit comments