2012-06-16 4 views
0

Я пытаюсь пересечь двоичное дерево поиска в порядке и поместить данные (отсортированные) в массив. по какой-то причине указатель на текущую позицию в массиве не движется вправо.Сборка: перемещение двоичного дерева поиска

Это decleration ДС:

TreeRoot DWORD    Null (left child) 
      DWORD Null (right child) 
      SDWORD 6 (numeric value) 

и это функция, которую я пытаюсь написать:

TreeToArray PROC 
    rootPtr=8; 
    ArrayPtr=rootPtr+4; 

    ;Saving the Registers 
    push ebp; 
    mov ebp,esp; 
    push esi; 
    push edx; 
    push ebx; 
    push edi; 
    push ecx; 

Check: 
    mov esi,rootPtr[ebp]; esi holds the current root 
    mov edi, ArrayPtr[ebp] ;edi holds the pointer to the array 
    cmp esi,Null ;if root=null 
    je Done2; 

LeftSubTree: 
    push edi 
    push BinTreeLeft[esi] 
    call TreeToArray; recursive call for left sub tree 

Visit: 
    mov ebx,BinTreeValue[esi] ;getting the value of the node 
    mov [edi],ebx 
    add edi,4 

RightSubTree: 
    push edi 
    push BinTreeRight[esi] 
    call TreeToArray; recursive call for right sub tree 

Done2: 
    pop ecx; 
    pop edi; 
    pop ebx 
    pop edx 
    pop esi 
    pop ebp 
    ret 8; 

TreeToArray ENDP 

ответ

1

Ваш код прямо сейчас выглядит следующим образом (если прописано в C):

typedef struct tNode 
{ 
    struct tNode* pLeftChild; 
    struct tNode* pRightChild; 
    int Value; 
} tNode; 

void TreeToArray(tNode* pNode, int* pArrayElement) 
{ 
    if (pNode == NULL) return; 

    TreeToArray(pNode->pLeftChild, pArrayElement); 

    *pArrayElement = pNode->Value; 
    pArrayElement++; 

    TreeToArray(pNode->pRightChild, pArrayElement); 
} 

Вы «перемещаете» указатель только при переходе на правый дочерний узел и забываете продвигать указатель при возврате к родительскому узлу.

Что вы хотите сделать вместо этого:

int* TreeToArray(tNode* pNode, int* pArrayElement) 
{ 
    if (pNode == NULL) return pArrayElement; 

    pArrayElement = TreeToArray(pNode->pLeftChild, pArrayElement); 

    *pArrayElement = pNode->Value; 
    pArrayElement++; 

    pArrayElement = TreeToArray(pNode->pRightChild, pArrayElement); 

    return pArrayElement; 
}