帐号 密码  
 
多路树查找-外部查找(B树)【源代码】

多路树查找-外部查找(B树)【下载及演示说明】

双向链表演示程序【下载及演示说明】

循环链表演示程序【下载及演示说明】

链表【讲解】

动态存储分配之边界标识法演示程序【下载及演示说明】

动态存储分配之边界标识法【讲解】

首次适应算法和最佳适应算法【讲解】

动态存储分配之边界标识法【源代码】

振荡排序算法【讲解】

振荡排序演示程序【下载及演示说明】

树和二叉树相互转化【讲解】

深度优先搜索【下载及演示说明】

深度优先搜索【源代码】

朴素字符串匹配演示程序【下载及演示说明】

当前1/4页
首页 上一页 下一页 尾页

算法讲堂

    本栏目所有文章由本站组织业内技术专家原创而成,用汇编语言向学习者讲解经典问题的编程思想和编程方法。

    本栏目所有文章的版权归本站所有,转载请注明出处为汇编网<www.asmedu.net> 。

    现本栏目的内容处于不断添加中,请随时关注。
算法讲堂-》树和二叉树相互转化【源代码】
    assume cs:code,ds:data,ss:stack

data segment

    db 'RABC.DE..F...GHK....#'
    
    db "Copyright (c) 2007 www.asmedu.net#"
    
    PTCV  db 16 dup(0)
    
    PTCDA db 128 dup(0)
    
    PTCDB db 128 dup(0)
    
    PTCDC db 128 dup(0)
    
data ends

stack segment stack

    dw 32 dup(0)
    
stack ends

code segment
start:
        mov ax,data
        mov ds,ax
        mov si,0
        
        mov ax,stack
        mov ss,ax
        mov sp,0
        
        call PToCTree
        
        call CToPTree
        
        mov ax,4c00h
        int 21h
        
;-----------------------------------PToCTree start
        
        ;ds:si
PToCTree:
        
        ;生成一个树放在本方法PTCData空间中
        ;PTCDA[0]存储数组的索引值
        ;PTCDB存储转换之后的二叉树,存储数据依次是节点,左节点索引,右节点索引
        
        push ax
        push di
        push si
        push bx
        push dx
        
        mov di,0
        mov byte ptr PTCV[0],0
        
        mov al,[si]
        mov PTCDA[di],al
        mov byte ptr PTCDA[di + 1],-1
        mov byte ptr PTCDA[di + 3],1
        
        add di,8
        inc si
        
PTCS:   
        mov al,[si]
        mov PTCDA[di],al
        mov al,PTCV[0]
        mov PTCDA[di + 1],al
        mov PTCDA[di + 3],1
        
        add di,8
        inc si
        cmp byte ptr [si],'#'
        je PTCC
        cmp byte ptr [si],'.'
        jne PTCS
PTCS1:  
        add byte ptr PTCV[0],8
        inc si
        cmp byte ptr [si],'#'
        je PTCC
        cmp byte ptr [si],'.'
        je PTCS1
        jmp PTCS
        
PTCC:   
        ;生成树结束
        mov byte ptr PTCDA[di],'#'
        
;-----------------------------------------------生成树结束
;--------------------------------------------------------------------------树转换成二叉树
        
        mov al,PTCDA[0]
        mov PTCDB[0],al
        mov byte ptr PTCDB[7],0
        
        mov di,0
        mov si,0
        mov bx,0
        
PTCCS1:
        
        push bx
        mov bx,offset PTCDA
        call PTCF1
        pop bx
        
        cmp word ptr PTCV[0],-1
        je PTCBackDataA
        ;左子树
        mov al,PTCV[0]
        mov ah,PTCV[1]
        mov di,ax
        add si,8
        mov ax,si
        mov byte ptr PTCDB[bx + 1],al
        mov al,PTCDA[di]
        mov PTCDB[si],al
        mov byte ptr PTCDB[si + 3],bl
        mov al,PTCDB[bx + 7]
        inc al
        mov PTCDB[si + 7],al
        mov bx,si
        jmp PTCCS1

PTCBackDataA:
        ;右子树
        ;回溯
        mov byte ptr PTCDB[bx + 1],-1
        
PTCBackDataB:
        
        mov ax,0
        mov al,PTCDA[di + 1]
        mov di,ax
        
        push bx
        mov bx,offset PTCDA
        call PTCF1
        pop bx
        
        cmp word ptr PTCV[0],-1
        je PTCNodeOver
        
        mov al,PTCV[0]
        mov ah,PTCV[1]
        mov di,ax
        
        add si,8
        mov al,PTCDA[di]
        mov PTCDB[si],al
        mov ax,si
        mov byte ptr PTCDB[bx + 2],al
        mov byte ptr PTCDB[si + 3],bl
        mov al,PTCDB[bx + 7]
        inc al
        mov PTCDB[si + 7],al
        mov bx,si
        jmp PTCCS1
        
PTCNodeOver:
        
        mov byte ptr PTCDB[bx + 2],-1
        call PTCF2
        mov ax,0
        mov al,PTCDA[di + 1]
        cmp byte ptr PTCDA[di + 1],-1
        je PTCReturn
        
        jmp PTCBackDataB
        
PTCReturn:
        
        mov byte ptr PTCDB[2],-1
        mov byte ptr PTCDB[3],-1
        mov byte ptr PTCDB[si + 8],'#'
        mov bx,offset PTCDA
        call ResumeSign
        
        pop dx
        pop bx
        pop si
        pop di
        pop ax
        ret
        
;--------function1 start
        
        ;在ds:[bx]指向的数据中查找当前节点di的孩子
PTCF1:  
        push si
        push ax
        
        mov si,di
        add si,8
        
PTCF1S1:
        
        cmp byte ptr [bx + si],'#'
        je PTCF1ReturnB
        mov ax,0
        mov al,[bx + si + 1]
        cmp ax,di
        je PTCF1ReturnA
        add si,8
        jmp PTCF1S1

PTCF1S2:
        
        add si,8
        jmp PTCF1S1
        
PTCF1ReturnA:
        
        cmp byte ptr [bx + si + 2],1
        je PTCF1S2
        mov byte ptr [bx + si + 2],1
        mov word ptr PTCV[0],si
        jmp PTCF1Return

PTCF1ReturnB:
        
        mov word ptr PTCV[0],-1
        
PTCF1Return:
        
        pop ax
        pop si
        ret
        
;--------function1 end

;--------function2 start

PTCF2:  ;查找当前节点的父
        push ax
        
PTCF2S:
        sub bx,8
        mov ax,0
        mov al,PTCDA[di]
        cmp al,PTCDB[bx]
        je PTCF2Return
        jmp PTCF2S
        
PTCF2Return:
        
        pop ax
        ret

;--------function2 end

;-----------------------------------PToCTree end


;-----------------------------------CToPTree start

;-------------------------------------------------------------------------二叉树向树的转换
        
CToPTree:
        
        push ax
        push bx
        push di
        push si
        
        mov bx,0
        mov di,0
        mov si,0
        mov al,PTCDB[bx]
        mov PTCDC[di],al
        mov byte ptr PTCDC[di + 1],-1
        mov byte ptr PTCDC[di + 3],1
        
CTPS:   
        
        cmp byte ptr PTCDB[bx + 1],-1
        je CTPS1
        
        mov ax,0
        mov al,PTCDB[bx + 1]
        mov bx,ax
        
        add si,8
        mov al,PTCDB[bx]
        mov PTCDC[si],al
        
        mov ax,di
        mov PTCDC[si + 1],al
        mov di,si
        mov byte ptr PTCDC[di + 3],1
        jmp CTPS
        
CTPS1:
        
        cmp byte ptr PTCDB[bx + 2],-1
        je CTPS2
        
        mov ax,0
        mov al,PTCDB[bx + 2]
        mov bx,ax
        
        add si,8
        mov al,PTCDB[bx]
        mov PTCDC[si],al
        
        mov al,PTCDC[di + 1]
        mov PTCDC[si + 1],al
        mov di,si
        mov byte ptr PTCDC[di + 3],1
        jmp CTPS
        
CTPS2:  
        
        mov ax,0
        mov al,PTCDC[di + 1]
        mov di,ax
        
        call CTPF1
        
        cmp byte ptr PTCDC[di + 1],-1
        je CTPReturn
        jmp CTPS1
        
CTPReturn:
        
        mov byte ptr PTCDC[si + 8],'#'
        
        pop si
        pop di
        pop bx
        pop ax
        ret
        
;--------function1 start

CTPF1:  ;查找
        push ax
        
CTPF1S:
        sub bx,8
        mov al,PTCDC[di]
        cmp al,PTCDB[bx]
        je CTPF1Return
        jmp CTPF1S
        
CTPF1Return:
        
        pop ax
        ret

;--------function1 end
        
;-----------------------------------CToPTree end

;--------恢复树的访问标志位
              
ResumeSign:
        
        push di
        push ax
        
        mov di,0
        
RSS:
        
        cmp byte ptr [bx + di],'#'
        je RSReturn
        mov al,PTCV[7]
        mov [bx + di + 2],al
        mov byte ptr [bx + di + 4],0
        add di,8
        jmp RSS
        
RSReturn:
        
        pop ax
        pop di
        ret
        
;--------结束
code ends
end start

[07/09/22]

Copyright C 2006-2025 ASMEDU.NET All Rights Reserved
Email: asmedu@163.com