2016-11-21 2 views
0

이진 검색 트리의 최소값을 제거해야하지만 현재는 깨끗한 코드를 가지고 있습니다. 나는이에 도착하면참조 개체 키를 null로 설정하면 예상대로 작동하지 않습니다.

MTE tempElement = root; 

if(root == null) return; 
else if((root.left == null) && (root.right == null)) 
{ 
    root = null; 
    return; 
} 
else if(root.left != null) 
{ 
    while(tempElement.left != null) tempElement = tempElement.left; 

    if(tempElement.right == null) tempElement = null; 
    else tempElement = tempElement.right; 
} 
else if(root.right != null) 
{ 
    if(tempElement.left == null) root = tempElement; 
    else 
    { 
     while(tempElement.left != null) tempElement = tempElement.left; 

     root.val = tempElement.val; 
     if(tempElement.right == null) tempElement = null; 
     else tempElement = tempElement.right; 
    } 
} 

이 코드에있어 문제가있다 : 나는 일을 예상대로 '는 t는이 코드를 (MTE는, MTE 왼쪽 MTE의 오른쪽 INT 발 키를 가지고)있어, 작업 코드 줄 - if(tempElement.right == null) tempElement = null; 내가 제공 한 코드 조각의 13 번째 줄은 어느 것입니까? 디버깅 할 때 tempElement를 null로 변경하지만 기본 루트 요소는 노드를 변경하지 않습니다.

+0

로컬 변수 인 tempElement를 null로 설정했지만 루트 필드는 설정하지 않습니다. 명백한 뿌리는 전혀 변하지 않습니다. – kaitoy

답변

3

당신은 부모 노드에 대한 포인터를 보유해야하고, 예를 들어, 부모 노드의 왼쪽 또는 오른쪽 포인터를 변경 : 예를 들어,이 null로 필드를 설정합니다 right! = null도 마찬가지입니다.

+0

감사합니다. woks는 매력을 좋아합니다. – dnc123

0

leftright 필드는 참조 변수입니다. 객체에 대한 참조를 보유 할 수 있습니다.

변수 tempElement은 로컬 변수입니다. 처음에는 객체에 대한 참조 사본을 보유합니다. 값이 복사 된 필드에 대한 참조를 보유하지 않습니다. 해당 지역 변수를 null로 설정하면 그 일이 모두 발생합니다.

개체의 필드를 null로 설정하려면 동일한 개체에 대한 참조 사본을 보유하는 로컬 변수에 할당하지 말고 필드에 할당해야합니다.

if(root.left != null) 
{ 
    MTE prev = tempElement; 
    while(tempElement.left != null) { 
     prev = tempElement; 
     tempElement = tempElement.left; 
    } 

    if(tempElement.right == null) prev.left = null; 
    else prev.left = tempElement.right; 
} 

하면 할 필요가

tempElement.left = null;