回 帖 发 新 帖 刷新版面

主题:作业还差点不够完善,哪位大侠指点一下

000000000000000000000000000000000000000000000000000000000000000000000000000
以下是源代码:

回复列表 (共3个回复)

沙发


  .MODEL SMALL
  .STACK
  .DATA
MSG1 DB 'Please input the root node:$'
MSG2 DB 0ah,0dh,'Please input the left nood : $'
MSG3 DB 0ah,0dh,'Please input the right nood : $'
MSG4 DB 0ah,0dh,'Has the left subnode of $'
MSG5 DB 0ah,0dh,'Has the right subnode of $'
MSG6 DB '?(y/n):',0AH,0DH,'$'
MSG7 DB 0AH,0DH,'The preorder is :$'
MSG8 DB 0AH,0DH,'The inder is : $'
MSG9 DB 0AH,0DH,'The postorder :$'
PRE_MSG DB 64 DUP (' ') ,'$'        
IN_MSG DB 64 DUP (' ') ,'$'         
POST_MSG DB 64 DUP (' ') ,'$'         
  .CODE 
MAIN   PROC FAR
       MOV  AX,@DATA 
       MOV  DS,AX
       MOV  ES,AX 

       XOR  SI,SI
       XOR  DI,DI
       XOR  BX,BX
       MOV  AL,23H                                ;先将#放入栈
       PUSH AX
       

       MOV  AH,09H                 
       LEA  DX,MSG1                                ;提示输入根节点
       INT  21H  
                                  ;输出字符串      
             
LEFT:  
       MOV  AH,01H          
       INT  21H            
       PUSH AX                                                             
       MOV  PRE_MSG[SI],AL   
       INC  SI                                    ;输入并存储根节点存储在前序数组里
                                                                    
       MOV  AH,09H
       LEA  DX,MSG4
       INT  21H                                   ;问节点有没有左子
       
       POP  AX
       MOV  AH,02H        
       MOV  DL,AL
       INT  21H                                   ;显示上次输入的节点
       PUSH AX
       MOV AH,09H
       LEA DX,MSG6
       INT 21H
       
       MOV  AH,01H       
       INT  21H                                   
       CMP  AL,79H                                 ;输入判断信息并判断
       JNZ  RIGHT                                   ;如不是跳到RIGHT
       
       MOV  AH,09H 
       LEA  DX,MSG2
       INT  21H       
       JMP  LEFT                                   ;等于则循环
      

板凳


RIGHT:
       POP  cX                                        
       MOV  IN_MSG[DI],cL                    ;取出最下面的左节点并  进中序存储数组   
       INC  DI 
       PUSH cX
       MOV  AH,09H
       LEA  DX,MSG5                                 ;问有没有右子
       INT  21H
             
       POP  AX
       MOV  AH,02H       
       MOV  DL,AL
       INT  21H                                       ;输出字符并显示
       PUSH AX
       MOV  AH,09H
       LEA  DX,MSG6      
       INT  21H              
              
       MOV  AH,01H       
       INT  21H                               
       CMP  AL,79H                                     ;将输入数与y比较
       JNZ   POST        
       
       MOV  AH,09H
       LEA  DX,MSG3
       INT  21H                                 ;提示输入右节点

       POP DX
       MOV DH,1            
       PUSH DX             ;只要没左子数,有右子数的数,高位加标志1
       JMP  LEFT            ;跳到LEFT循环
POST:
       POP  AX
       MOV  POST_MSG[BX],AL       ;取出接点并放进后序数组    
       INC  BX
       POP  AX                    
       CMP  AL,23H            ;POP出的数与#比,如同就打印输出
       PUSH AX    
       JZ   PRINT            ;如果相等就说明栈空,进行打印输出结果
       POP  DX
       CMP  DH,1 

       PUSH DX                                                      
       JZ   post
       JMP  RIGHT
;----------------------------------------
PRINT:
       MOV AH,09H              
       LEA DX,MSG7      
       INT 21H              ;前序输出提示  
       MOV AH,09H
       LEA DX,PRE_MSG
       INT 21H              ;输出前序

       MOV AH,09H
       LEA DX,MSG8   
       INT 21H              ;中序输出提示                       
       MOV AH,09H
       LEA DX,IN_MSG    
       INT 21H             ;输出中序 

       MOV AH,09H
       LEA DX,MSG9
       INT 21H  
       MOV AH,09H
       LEA DX,POST_MSG  
       INT 21H                 
       
       
  mov ax,4c00h
  int 21h
main endp
  end main

3 楼

这是一个二叉树以及遍历的程序,基本上差不多了,但是要求控制层数最多为5层,哪位高手帮忙指点一下,谢了!

我来回复

您尚未登录,请登录后再回复。点此登录或注册