📄 postf.asm
字号:
;普通树的后根遍历算法(利用父指针数组)。
STACK EQU 1FH ;用户堆栈所在页面。
BOTTOM EQU 00H ;用户堆栈栈底单元。
TOP DATA 3EH ;用户堆栈栈顶指针。
TREE EQU 20H ;普通树节点存放的片外RAM页面。
POINT EQU 21H ;父指针数组存放的片外RAM页面。
OUT EQU 22H ;被访问节点信息输出存放的片外RAM页面。
ORG 0000H
LJMP TEST
ORG 100H
TEST: MOV SP,#5FH ;设置足够大的系统堆栈空间。
MOV DPTR,#DATS;将普通树的节点数组存放到片外RAM中。
MOV P2,#TREE
MOV R0,#0
MOV R2,#19
COPY: CLR A
MOVC A,@A+DPTR
MOVX @R0,A
INC DPTR
INC R0
DJNZ R2,COPY
MOV DPTR,#FDAT;将普通树的父指针数组存放到片外RAM中。
MOV P2,#POINT
MOV R0,#0
MOV R2,#19
COPY1: CLR A
MOVC A,@A+DPTR
MOVX @R0,A
INC DPTR
INC R0
DJNZ R2,COPY1
MOV SP,#5FH ;设置足够大的系统堆栈空间。
MOV DPH,#OUT;指向输出存放节点信息的片外RAM页面。
MOV DPL,#0
MOV R2,#0
CLR A
CLEAR: MOVX @DPTR,A ;初始化输出区。
INC DPTR
DJNZ R2,CLEAR
MOV P2,#TREE;指向树节点信息存放页面。
MOV R0,#0
MOV DPH,#OUT;指向输出存放节点信息的片外RAM页面。
MOV DPL,#0
MOVX A,@R0 ;读取普通树的有效节点总数。
MOVX @DPTR,A ;存放到输出区的00H单元。
MOV R2,A ;保存节点总数。
INC R2 ;设置父指针数组边界。
INC R0 ;指向根节点。
INC DPTR ;指向输出区第一个存放位置。
JZ STOP ;如果是空树,则结束访问。
LCALL SETNULL ;初始化用户堆栈。
LCALL POST ;从全树的根节点出发,调用后根遍历算法。
STOP: LJMP STOP ;遍历顺序为LMNHIEFBCOPQJRKGDA。
DATS: DB 12H,41H,42H,43H ;普通树的节点数组。
DB 44H,45H,46H,47H
DB 48H,49H,4AH,4BH
DB 4CH,4DH,4EH,4FH
DB 50H,51H,52H
FDAT: DB 00H,00H,01H,01H ;普通树的父指针数组。
DB 01H,02H,02H,04H
DB 05H,05H,07H,07H
DB 08H,08H,08H,0AH
DB 0AH,0AH,0BH
POST: MOV P2,#TREE;指向树节点信息存放页面。
MOVX A,@R0 ;读取当前节点。
JZ POSTE ;是虚节点则返回。
MOV A,R0 ;取当前节点地址。
INC A ;加一。
MOV R1,A ;作为父指针数组查表起点。
LOOP: MOV A,R1 ;父指针数组查表出界否?
XRL A,R2
JZ LOOPE ;出界,结束查找子节点。
MOV P2,#POINT;未出界,取父指针所在页面。
MOVX A,@R1 ;读取父指针值。
CLR C
SUBB A,R0 ;与当前节点地址比较。
JC LOOP1 ;偏小,继续往后查找。
JNZ LOOPE ;偏大,结束查找子节点。
MOV A,R0 ;找到一个子节点,作访问准备。
LCALL DPUSH ;将当前节点编号压入用户堆栈进行保护。
MOV A,R1
LCALL DPUSH ;将当前节点编号压入用户堆栈进行保护。
MOV R0,A ;以子节点为根节点。
LCALL POST ;然后按后根遍历算法访问子树(递归调用)。
LCALL DPOP ;取出保存的节点编号。
MOV R1,A
LCALL DPOP ;取出保存的节点编号。
MOV R0,A
LOOP1: INC R1 ;继续往后查找新的子节点。
SJMP LOOP
LOOPE: MOV P2,#TREE;指向树节点信息存放页面。
MOVX A,@R0 ;读取当前节点。
MOVX @DPTR,A ;输出,完成访问的目的。
INC DPTR ;调整输出指针。
POSTE: RET ;返回。
SETNULL:MOV A,#BOTTOM;初始化空栈,取栈底单元位置。
MOV TOP,A ;使栈顶指针指向栈底。
RET ;设置好空栈。
DPUSH: INC TOP ;新栈顶。
PUSH DPH
PUSH DPL
MOV DPH,#STACK;取堆栈所在页面。
MOV DPL,TOP ;取栈顶单元位置。
MOVX @DPTR,A ;数据压入栈顶。
POP DPL
POP DPH
RET ;结束。
DPOP: PUSH DPH
PUSH DPL
MOV DPH,#STACK;取堆栈所在页面。
MOV DPL,TOP ;取栈顶单元。
MOVX A,@DPTR ;取出栈顶元素。
DEC TOP ;指向新的栈顶。
POP DPL
POP DPH
RET ;结束。
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -