0

二分探索木を順番にトラバースし、(ソートされた) データを配列に配置しようとしています。何らかの理由で、配列内の現在の位置へのポインターが右に移動していません。

これは DS の宣言です。

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
4

1 に答える 1

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;
}
于 2012-06-22T20:16:32.497 に答える