2010-12-23 8 views
1

안녕 저는 BST를 쓰고 Child를 추가하기위한 다음 함수를 작성했습니다.이 함수의 문제점은 무엇입니까

void addChild(T value) 
{ 
    temp = root; 
    while(0 != temp) 
    { 
    temp1 = temp; 
    if(value > temp->getValue()) 
      temp = temp->getRightChild(); 
     else 
      temp = temp->getLeftChild(); 
    } 
    if(temp1->getValue() > value) 
    { 
     temp1->setRightChild(new Child(value)); 
    } 
    else 
    { 
     temp1->setLeftChild(new Child(value)); 
    } 
} 

"23 12 122 1 121 15"를 입력하고 있습니다. 루트는 클래스의 생성자에서 만들고있는 노드 23입니다.

문제점 : 트리 트래버스를 수행 할 때 나는 출력으로 23과 15 만 얻고 있습니다. 질문 :이 기능에서 내가 뭘 잘못하고 있니?

+0

아마도 트래버 설 기능에 문제가 있습니까? 또한 'temp'변수와 'temp1' 변수에 대한 선언이 표시되지 않습니다. 그들은 글로벌입니까 ?? 어쨌든 디버거 (예 :'gdb')를 사용하여 코드를 따르는 것이 좋습니다. 문제를 찾기가 아주 간단해야합니다. – davka

답변

1

시도 :

if(value > temp1->getValue()) 

는 ... 그렇지 않으면 삽입 조건은 위의 루프의 자리에 대한 검색 다르다.

+0

if (root == null) return을 추가해서는 안됩니다. 함수의 시작 부분에서도 그렇습니까? – Muggen

+0

@Muggen - 아마도 if (root == null) {root = new Child (value); return;}'-하지만 루트가 생성자에 설정되었다고 언급했습니다. – sje397

1

조건이 혼합되어 있습니다.

경우 (값> temp-> getValue())

을 setRight 단지 변경 시도 (temp1-> getValue()> 값) 경우 getRight

에 대향 마지막 상태.

0

나는 Captain and sje의 이전 답변에 동의하지만, 심각하다고 설명하지는 않습니다. 우리는 당신의 나무가 부족하다고 말합니다. 가능한 문제는 을 자식으로 사용하여 임시 1을 추가하여 이전 자식을 모두 삭제하는 것입니다. 그것은 아마도 T :: setRightChild()와 T :: setLeftChild() 함수에서 행해진 다.

+0

부정확 한 조건은 결과를 설명합니다 : 올바른 아이를 추가하고 새로운 왼쪽 아이를 추가하면 (기존 아이들을 묶어 포인터를 덮어 썼을 때) 데이터를 잃어 버릴 수 있습니다. . 귀하의 요점은이 가능성에 대한 점검이 있어야한다는 것이고, 아마도 그것은 좋은 것입니다. – sje397

+0

외부에서 무슨 일이 일어날 지 말하기가 어렵습니다. 이 함수는 제대로 작동하려면 몇 가지 전제 조건이 필요합니다. –

관련 문제