Я пытаюсь написать функцию, которая вычисляет высоту дерева, используя этот алгоритм:
height(root)
if root == nil then return 0
h1 = height(root.left)
h2 = height(root.right)
answer = max(h1,h2) +1
return answer
сначала я вызываю функцию, передающую корень, в базовом случае, если дерево равно нулю, высота равна нулю, в противном случае вызываю рекурсию для левого сына корня и сохраняю значение, затем вызываю рекурсию справа сына корня и сохраните значение, тогда высота - это просто максимальное значение между левым и правым сыном плюс корень.
Я реализовал это в mars, но получил: Ошибка в строке /Users/mips1.asm 47: Исключительная ситуация времени выполнения в 0x0040004c: адрес магазина не выровнен по границе слова 0x00000007
.data
tree: .word a
a: .word 3, y, c
y: .word 21, d, e
c: .word 4, 0, 0
d: .word 5, f, g
e: .word -3, 0, h
f: .word 6, 0, 0
g: .word 9, i, 0
h: .word 18, 0, w
i: .word 22, 0, 0
w: .word 1, 0, 0
answer: .word 0
.text
.globl main
main:
la $v0, a
lw $a0, 0($v0)
jal height
sw $v0, answer
#print
li $v0,1
lw $a0, answer
syscall
#end
li $v0, 10
syscall
#________________________________________
#height
.globl height
height:
addi $sp, $sp, -12
sw $ra, 0($sp)
sw $s0, 4($sp)
#base case
li $v0, 0
beq $a0, 0, leaf
move $s0, $a0
sw $a0, 4($a0) #x.left
jal height
sw $a0, 8($a0) #x.right
jal height
#answer = max(heigtLeft, heigtRight)+1
leaf:
lw $ra, 0($sp)
lw $s0, 4($sp)
addi $sp, $sp, 8
jr $ra