📄 binary.txt
字号:
PAGE 60,132
TITLE BINTREE
.MODEL SMALL
.STACK 64
.DATA
BUFF1 DB 10 DUP(?) ;暂存结点数
BUFF2 DB 40 DUP(?) ;顺序存储结点数组
BUFF3 DB 40 DUP(?) ;结点中序存储
BUFF4 DB 40 DUP(?) ;结点后序存储
NODE DB 2,?,2 DUP(?) ;存储输入字符缓冲区
MESS0 DB 0AH,0DH,'$'
MESS1 DB 'Please enter the root:','$'
MESS2 DB "'S left children:",'$'
MESS3 DB "'S right children:",'$'
MESS4 DB "PreOrderTraverse is:",'$'
MESS5 DB "InOrderTraverse is:",'$'
MESS6 DB "PostOrderTraverse is:",'$'
NODES DW 0H
NODSI DW 0H
;===================================================================
.CODE
;===================================================================
;主过程
;===================================================================
MAIN PROC FAR
MOV AX,@DATA
MOV DS,AX ;初始化段寄存器
LEA DX,MESS1 ;提示输入根结点
MOV AH,09H
INT 21H
CALL ROOT ;调用ROOT过程输入根结点
MOV DL,'$'
MOV [SI],DL ;在字符串末尾加'$'符
MOV [DI],DL
CALL HUICHE ;回车换行
CALL PREORDER ;先序输出
CALL INORDER ;中序输出
CALL POSTOUT ;后序处理
CALL POSTORDER ;后序输出
MOV AH,1
INT 21H
MOV AX,4C00H
INT 21H
MAIN ENDP
;=====================================================================
;回车换行
;=====================================================================
HUICHE PROC NEAR
MOV DX,OFFSET MESS0
MOV AH,09
INT 21H
RET
HUICHE ENDP
;=====================================================================
;根(ROOT)结点输入
;=====================================================================
ROOT PROC NEAR
LEA DX,NODE ;将字符存入缓冲区并回显
MOV AH,0AH
INT 21H
MOV DL,NODE+2
CMP DL,0DH
JE ENDROOT
CALL HUICHE ;回车换行
CALL HUIXIAN ;显示该输入结点的内容
MOV BP,OFFSET BUFF4 ;将后序存储区的首地址赋给BP寄存器
MOV DI,OFFSET BUFF3 ;将中序存储区的首地址赋给DI寄存器
MOV SI,OFFSET BUFF2 ;将顺序存储区的首地址赋给SI寄存器
MOV WORD PTR NODSI,SI
MOV BX,OFFSET BUFF1
MOV WORD PTR NODES,BX
CALL CUNCHU
MOV DX,OFFSET MESS2 ;询问是否输入左结点
MOV AH,09H
INT 21H
CALL LEFT ;输入左结点
ENDROOT:
RET
ROOT ENDP
;=====================================================================
;LEFT过程输入左子树
;=====================================================================
LEFT PROC NEAR
LEA DX,NODE ;将字符存入缓冲区并回显
MOV AH,0AH
INT 21H
MOV DL,0DH ;是否是回车键
CMP DL,NODE+2
JE RIGHTNODE ;是则转RIGHTNODE
CALL HUICHE
CALL HUIXIAN ;显示该输入结点的内容
CALL CUNCHU
MOV DX,OFFSET MESS2 ;询问是否输入左结点
MOV AH,09H
INT 21H
CALL LEFT
JMP ENDED
RIGHTNODE:
CALL KONGGE ;存储空格
CALL RIGHT
ENDED:
RET
LEFT ENDP
;=====================================================================
;RIGHT过程输入右子树
;=====================================================================
RIGHT PROC NEAR
CALL HUICHE
CMP BX,WORD PTR NODES
JE ENDRET
DEC BX
MOV DL,[BX]
MOV [DI],DL ;中序存储数组
INC DI
MOV AH,2
INT 21H
MOV DX,OFFSET MESS3 ;询问是否输入右结点
MOV AH,09H
INT 21H
LEA DX,NODE
MOV AH,0AH
INT 21H
MOV DL,0DH ;是否是回车键
CMP DL,NODE+2
JE RIGHT2 ;是则转RIGHT2
CALL HUICHE
CALL HUIXIAN
CALL CUNCHU
MOV DX,OFFSET MESS2 ;询问是否输入左结点
MOV AH,09H
INT 21H
CALL LEFT
JMP ENDRET
RIGHT2:
CALL KONGGE
CALL RIGHT
ENDRET:
RET
RIGHT ENDP
;=====================================================================
KONGGE PROC NEAR ;存储空格
MOV BYTE PTR[SI],20H
INC SI
RET
KONGGE ENDP
;=====================================================================
;显示当前结点的内容
;=====================================================================
HUIXIAN PROC NEAR
MOV DL,NODE +2 ;显示该输入结点的内容
MOV AH,2 ;调用INT中断的2号功能显示一个字符
INT 21H
RET
HUIXIAN ENDP
;=====================================================================
;存储结点数组
;=====================================================================
CUNCHU PROC NEAR
MOV [BX],DL
MOV [SI],DL
INC SI
INC BX
RET
CUNCHU ENDP
;=====================================================================
; 初始化索引寄存器
;=====================================================================
POSTOUT PROC NEAR
LEA SI,OFFSET BUFF2 ;初始化索引寄存器的值
LEA DI,OFFSET BUFF3
MOV BX,WORD PTR NODSI ;将字符串的首地址送给索引指针BX
MOV DL,[BX]
MOV [SI],DL
MOV [DI],DL
INC SI
INC DI
INC BX
CALL POSTCUN
RET
POSTOUT ENDP
;=====================================================================
;后序存储数组
;=====================================================================
POSTCUN PROC NEAR
XUNHUAN:
MOV DL,[BX]
CMP DL,20H ;比较当前字符是否是空格
JE KONGE1
CMP [BX],'$' ;比较是否是'$'
JE JIESHU ;是结束循环
MOV [SI],DL
MOV [DI],DL
INC SI
INC DI
INC BX
JMP XUNHUAN
KONGE1:
DEC SI
MOV DL,[BX-1]
CMP DL,20H ;比较上一字符是否是空格
JE KONGE2 ;是则转移KONGE2
INC BX
JMP XUNHUAN ;继续循环
KONGE2:
INC BX
XUNHUAN2:
MOV DL,[SI]
DEC DI
CMP [DI],DL ;比较[SI]和[DI]中的内容是否相等
JE ENDXUNHUAN ;是结束内循环
MOV DL,[DI]
MOV DS:[BP],DL ;存储后序数组
INC BP
JMP XUNHUAN2
ENDXUNHUAN:
INC DI
JMP XUNHUAN ;继续外层循环
JIESHU:
MOV DL,'$'
MOV DS:[BP],DL ;在字符串末尾加'$'符
RET
POSTCUN ENDP
;=====================================================================
;先序遍历
;=====================================================================
PREORDER PROC NEAR
MOV DX,OFFSET MESS4
MOV AH,09H
INT 21H
MOV BX,WORD PTR NODSI
ADD1:
CMP BYTE PTR[BX],20H ;比较是否是空格
JE ADD2 ;是则转移ADD2
CMP [BX],'$' ;比较是否是空格
JE JIESHU2 ;是则结束输出
MOV DL,[BX]
MOV AH,02H
INT 21H ;调用中断输出当前字符
INC BX ;索引指针BX加1
JMP ADD1 ;检查输出下一字符
ADD2:
INC BX ;空格不输出,索引指针BX加1
JMP ADD1 ;检查输出下一字符
JIESHU2:
CALL HUICHE
RET
PREORDER ENDP
;=====================================================================
;中序遍历
;=====================================================================
INORDER PROC NEAR
MOV DX,OFFSET MESS5
MOV AH,09H
INT 21H
LEA DX,BUFF3
MOV AH,09H
INT 21H
CALL HUICHE
RET
INORDER ENDP
;=====================================================================
;后序遍历
;=====================================================================
POSTORDER PROC NEAR
MOV DX,OFFSET MESS6
MOV AH,09H
INT 21H
LEA DX,BUFF4
MOV AH,09H
INT 21H
RET
POSTORDER ENDP
END MAIN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -