Well, each row has at most 2^n elements, so you could just make an array of size [1+2+4+8 ...] (that is, 2^(n+1)-1)
Some space is wasted, but unless the tree is really big I don't think it matters too much. (you'll also need a way to represent nodes that don't exist (probably giving them a value that you never use, like -1, or using a separate array to keep track of that)
for navigating the tree, it's easier if it's 1-indexed:
ary[1]
/ \
ary[2] ary[3]
/
ary[4] ...
movement:
up: N>>1
left: N<<1
right: N<<1 OR 1
so, for example, the root node is index 1, so to move down the right branch you'd go to N<<1 OR 1, which is 3. moving left from there is N<<1, which is 6.
Binary trees?
Root / Programming Questions / [.]
MZ952Created:
ninjagnu wrote a tree system for https://smilebasicsource.com/page?pid=1009
The system was something like
- data array
+ implementations:
* string: items can be length+chars. Resizing fields can be problematic and might mean memory management passes
* <type>[]: don't have to worry about resizing. uhh wait are there even any disadvantages
- tree array for binary tree structure
+ contains value "pointers"/indexes in data array
+ ninjagnu's probably had left/right pointers in the tree array but 12's solution might be okay for some applications
DEF TOTREE(A[]) DIM R[1] PUSH R,SHIFT(A) R[0]=1'Keeps number of rows DIM I,V WHILE LEN(A) V=SHIFT(A) N=1 WHILE TRUE IF V<R[N] THEN N=N<<1 ELSEIF V>=R[N] THEN N=N<<1 OR 1 ENDIF IF N>LEN(R)-1 THEN FOR I=0 TO POW(2,R[0])-1 PUSH R,-1'Placeholder value for empty nodes NEXT I INC R[0] ENDIF IF R[N]==-1 THEN R[N]=V BREAK ENDIF WEND WEND RETURN R END
DIM A[0] PUSH A,5 PUSH A,2 PUSH A,9 PUSH A,1 PUSH A,7 DIM TA[0] COPY TA,TOTREE(A) PRINTTREE TA > [3] > 5 > 2 9 > 1 -1 7 -1