2014-04-11 2 views
2

안녕하세요 인터넷을 통해이 논리를 읽고 내게 때문에 일어나는 생각하는 오류 세그먼트 오류를주고 C++ 위레벨 순서 순회 ++

void levelorder(struct node* root) 
{ 
    struct node* temp = (struct node*)malloc(sizeof(struct node)); 
    std::queue<node*> qq; 

    if(root==NULL) 
    { 
     return; 
    } 
    qq.push(root); 

    while(!qq.empty()) 
    { 
     temp=qq.front(); 
     qq.pop(); 
     printf("%d",temp->data); 
     qq.push(temp->left); 
     qq.push(temp->right); 
    } 
} 

그러나의 레벨 주문 트리 탐색을 구현하는 시도

temp->left 

가 존재하지 않습니다. 아니면이 구현을 위해 llQueue가 필요합니까? 아무도 이것에 대해 어떤 생각을 가지고 있습니까?

+0

'temp'에 'malloc'을 호출하지 마십시오. 한 포인터를 다른 포인터에 할당하면 다른 포인터에 메모리를 할당 할 필요가 없습니다. 할당 된 포인터와 동일한 메모리를 가리킬 것입니다. 또한 malloc의 반환 값을 캐스팅하지 않아야합니다. – Dukeling

답변

3

게시 된 코드는 트리의 나뭇잎에서 null 포인터를 고려하지 않습니다. 온도가 somethig에 다른 사람에 할당 될 때, 또한, 누출,이 공간은 해제되지 않고 :

한편
void levelorder(struct node* root) 
{ 
    std::queue<node*> qq; 
    qq.push(root); 
    while(!qq.empty()) 
    { 
     struct node* node = qq.front(); 
     qq.pop(); 
     if (node) { 
      printf("%d",temp->data); 
      qq.push(temp->left); 
      qq.push(temp->right); 
     } 
    } 
} 

가 임시로 메모리 할당이 손실 :이 라인을 따라 고정 할 수 있습니다.

0

귀하의 아이디어가 맞는 것처럼 보이지만 실제 데이터를 모른 채 이야기하는 것은 불가능합니다. 코드에서 leftright 구성원이 NULL이거나 정의되지 않은 위치를 가리킬 가능성이 있습니다. 즉 left 또는 right 포인터 다음에 오류가 발생할 수 있습니다.

2

두 가지 문제 :

  1. 메모리 온도에 할당 유출되고 리프 노드에서 비 필요한
  2. 널 포인터는

올바른 @anumi 의해 제안 된 구현을 선택하지. 그러나 나는 이것을 선호 할 것이다 :

void levelorder(struct node* root) 
{ 
    if(!root) return; 
    std::queue<node*> qq; 
    qq.push(root); 
    while(!qq.empty()) 
    { 
     struct node* node = qq.front(); 
     qq.pop(); 
     printf("%d", node->data); 
     if(node->left) qq.push(node->left); 
     if(node->right) qq.push(node->right); 
    } 
} 

편집 : 비어있는 나무를 주석에 따라 처리한다.

+1

+1, 쓸모없는 재귀 호출보다 빠릅니다. 그러나 나무가 비어 있다면 그것은 또한 실패합니다. – Ralor

+0

빈 나무에 대해서는이 코드가 작동하지 않습니다! – anumi

+1

P. if (node ​​== NULL) return을 추가하십시오. 처음에는 충분하다. – Ralor