【发布时间】:2012-04-24 18:15:31
【问题描述】:
树遍历例程接受 3 个参数,第一个节点、处理函数和顺序常数。
traverse_tree:
addi $sp,$sp,-8
sw $ra,0($sp)
sw $a0,4($sp)
beq $a0,$zero,done
move $t3,$a2
move $t2,$a1
move $t0,$a0
li $t1,PRE_ORDER
beq $t3,$t1,preorder
li $t1,IN_ORDER
beq $t3,$t1,inorder
li $t1,POST_ORDER
beq $t3,$t1,postorder
preorder:
jalr $t2
lw $a0,4($t0)
jal traverse_tree
lw $a0,8($t0)
jal traverse_tree
jal done
inorder:
lw $a0,4($t0)
jal traverse_tree
move $a0,$t0
jalr $t2
lw $a0,8($t0)
jal traverse_tree
jal done
postorder:
lw $a0,4($t0)
jal traverse_tree
lw $a0,8($t0)
jal traverse_tree
move $a0,$t0
jalr $t2
jal done
done:
lw $ra,0($sp)
lw $a0,4($sp)
addi $sp,$sp,8
jr $ra
程序在遇到第三个元素时停止。我很确定这个元素是一个两个叶子都为空的节点。
【问题讨论】:
-
您的
$t0被每个jal traverse_tree破坏——在您从它返回后,$t0将不一样。尝试在开始时也推送$t0(并在最后弹出)。
标签: assembly tree mips traversal