📄 postz.asm
字号:
;普通树的后根遍历算法(利用子指针数组)。
STACK EQU 1FH ;用户堆栈所在页面。
BOTTOM EQU 00H ;用户堆栈栈底单元。
TOP DATA 3EH ;用户堆栈栈顶指针。
TREE EQU 20H ;普通树存放的片外RAM页面。
POINT1 EQU 21H ;第一指针存储在21H页面。
POINT2 EQU 22H ;第二指针存储在22H页面。
POINT3 EQU 23H ;第三指针存储在23H页面。
OUT EQU 24H ;被访问节点信息输出存放在24H页面。
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,#Z1;将普通树的第一指针数组存放到片外RAM中。
MOV P2,#POINT1
MOV R0,#0
MOV R2,#19
COPY1: CLR A
MOVC A,@A+DPTR
MOVX @R0,A
INC DPTR
INC R0
DJNZ R2,COPY1
MOV DPTR,#Z2;将普通树的第二指针数组存放到片外RAM中。
MOV P2,#POINT2
MOV R0,#0
MOV R2,#19
COPY2: CLR A
MOVC A,@A+DPTR
MOVX @R0,A
INC DPTR
INC R0
DJNZ R2,COPY2
MOV DPTR,#Z3;将普通树的第三指针数组存放到片外RAM中。
MOV P2,#POINT3
MOV R0,#0
MOV R2,#19
COPY3: CLR A
MOVC A,@A+DPTR
MOVX @R0,A
INC DPTR
INC R0
DJNZ R2,COPY3
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单元。
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
Z1: DB 00H,02H,05H,00H ;普通树的第一指针数组。
DB 07H,08H,00H,0AH
DB 0CH,00H,0FH,12H
DB 00H,00H,00H,00H
DB 00H,00H,00H
Z2: DB 00H,03H,06H,00H ;普通树的第二指针数组。
DB 00H,09H,00H,0BH
DB 0DH,00H,10H,00H
DB 00H,00H,00H,00H
DB 00H,00H,00H
Z3: DB 00H,04H,00H,00H ;普通树的第三指针数组。
DB 00H,00H,00H,00H
DB 0EH,00H,11H,00H
DB 00H,00H,00H,00H
DB 00H,00H,00H
POST: MOV P2,#TREE;指向树节点信息存放页面。
MOVX A,@R0 ;读取当前节点。
JZ POSTEND ;是虚节点则返回。
MOV P2,#POINT1;取第一指针所在页面。
MOVX A,@R0 ;读取第一个子节点的地址。
JZ POST1 ;一个子节点也没有,返回当前节点。
XCH A,R0 ;存放第一子节点地址,并取当前访问节点的编号。
LCALL DPUSH ;将当前节点编号压入用户堆栈进行保护。
LCALL POST ;然后按后根遍历算法访问第一子树(递归调用)。
LCALL DPOP ;取出保存的节点编号。
MOV R0,A
MOV P2,#POINT2;取第二指针所在页面。
MOVX A,@R0 ;读取第二个子节点的地址。
JZ POST1 ;没有子节点,返回当前节点。
XCH A,R0 ;存放第二子节点地址,并取当前访问节点的编号。
LCALL DPUSH ;将当前节点编号压入用户堆栈进行保护。
LCALL POST ;然后按前根遍历算法访问第二子树(递归调用)。
LCALL DPOP ;取出保存的节点编号。
MOV R0,A
MOV P2,#POINT3;取第三指针所在页面。
MOVX A,@R0 ;读取第三个子节点的地址。
JZ POST1 ;没有子节点,返回当前节点。
XCH A,R0 ;存放第三子节点地址,并取当前访问节点的编号。
LCALL DPUSH ;将当前节点编号压入用户堆栈进行保护。
LCALL POST ;然后按前根遍历算法访问第三子树(递归调用)。
LCALL DPOP ;取出保存的节点编号。
MOV R0,A
POST1: MOV P2,#TREE;指向树节点信息存放页面。
MOVX A,@R0 ;读取当前节点。
MOVX @DPTR,A ;完成最后访问根节点的目的。
INC DPTR ;调整输出指针。
POSTEND: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 + -