2017-01-17 3 views
0

시작하기 전에 Stack Overflow에 익숙하지 않으므로이 게시물에서 잘못된 형식의 세부 정보를 사과드립니다. 필요한 경우 수정하십시오.C# insert function from BST

어쨌든 제 질문에 대해서 저는 C#을 처음 접했고, 저는 C++과 상당히 괜찮습니다. 그러나 저는 C#을 배워야합니다. BST에 대한 삽입 기능을 사용하고 있으며 실수를 파악하지 못하는 것 같습니다. 코드를 실행하면 루트가 계속 교체됩니다. 값 5를 삽입 한 다음 값 6을 삽입 한 후 트리는 값 6으로 만 구성됩니다. Root.Num/.Left /. Right에 대해 내 속성을 사용하는 방법과 관련이 있다고 생각합니다.

private void insertHelper(int value, BSTNode root) 
{ 

    if (this.Root == null) //empty tree, make new node 
    { 
     BSTNode node = new BSTNode(value); 
     this.Root = node; 
    } 
    else if (value < this.Root.Num) 
    { 
     insertHelper(value, Root.Left); 
    } 
    else if (value > this.Root.Num) 
    { 
     insertHelper(value, Root.Right); 
    } 
} 

내가 그것을 기술적으로 쉽게해야한다하더라도 그들과 거래를하지 않아도 포인터를 사용하지 않고 잃어버린 느낌 :

여기 내 코드입니다. 누군가 논리적으로 정확한 부분이 아닌 것을 지적 해 주시겠습니까? 감사!

답변

0

전달할 매개 변수에 관계없이 항상 this이 사용됩니다. 즉각적인 수정은 전달 된 매개 변수를 root으로 사용합니다. 첫 번째 통화를 가정

이 같은 것입니다 - - 또한 당신은 당신이 적절한 널 체크를 할 수 있는지 확인해야합니다 다음과 같은 접근 방식은 작동 할 수 insertHelper(//value, //the root node)

+0

이 종류의 동일 그 여분의 널 (null) 검사를 추가하지 않을까요

private void insertHelper(int value, BSTNode root) { if (root == null) //empty tree, make new node { BSTNode node = new BSTNode(value); this.Root = node; } else if (value < root.Num) { if(root.Left != null){ insertHelper(value, root.Left); }else{ root.Left = new BSTNode(value); } } else if (value > root.Num) { if(root.Right!= null){ insertHelper(value, root.Right); }else{ root.Right= new BSTNode(value); } } } 
재귀를 사용하면 초기 검사로 돌아가므로 이번에는 검사 할 루트가 왼쪽 노드가 될 것입니다 (value, root.Left)? – CodySig

+0

'this.Root'를 사용하는 방식 때문에 null 체크가 필요합니다. 보낸 사람이 무엇이든, 'this.Root''는 항상 같은 객체입니다. 그런 다음 null 검사를 제거하려면 다르게 구현해야합니다. –

+0

오케이 그 말이 맞다. temp = temp.Left 또는 temp.Right 등을 사용하여 임시 노드를 가로 지르는 다른 방법이있다. – CodySig