2016-10-12 7 views
1

이진 검색 트리에 삽입 및 인쇄를 구현할 때. 첫 번째 루트 노드 만 출력합니다. 왜 도와 주시겠습니까? 바이너리 검색 트리의 기본 구현. 처음에는 학습을 시작하고 고급 항목으로 이동하지만 첫 번째 단계에서는 걸림돌이됩니다. 루트 노드에 노드를 추가하지 않는 것 같습니다.이진 검색 트리에 삽입 할 수 없습니다.

class bstrees{ 
class Node 
{ 
    int data; 
    Node left; 
    Node right; 
    public Node(int data) 
    { 
     this.data=data; 
     this.left=null;  
     this.right=null; 
    } 
} 
Node root; 
bstrees(){root=null;} 

public void insert(int data){ 
    root=insert_node(root,data); 
} 
public Node insert_node(Node r,int n){ 
    if(r==null){ 
     Node n1=new Node(n); 
     //root=n1; 
     return n1 ; 
    } 
    else if(root.data<=n){ 
     insert_node(root.right,n); 
    } 
    else{ 
     insert_node(root.left,n); 
    } 
    return r; 
} 
public void print_t(){ 
    print_t(root); 
} 
private void print_t(Node r){ 
    //System.out.println(r); 
    if(r!=null){ 

    // System.out.println(r.left);   
    // System.out.println(r.right); 
     print_t(r.left); 
     System.out.println(r.data+" "); 
     print_t(r.right); 
    } 

} 


} 
public class BST_prac { 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    bstrees b1=new bstrees(); 
    b1.insert(5); 
    b1.insert(1); 
    b1.print_t(); 

} 

} 

그것은 단지 트리에 값 1 삽입 호출에

+0

첫눈에/테스트 코드조차 보이지 않으므로 먼저 null을 확인하십시오. [여기] (http://stackoverflow.com/questions/5560679/inserting-nodes-into-a) -binary-tree-in-java-question) –

+0

Java 명명 규칙을 읽으십시오. 클래스 이름 시작 대문자. 당신은 abbreviate하지 않는다. (BinaryTree는 bstree보다 이해하기가 훨씬 쉽고 is not이다.) 당신은 SOME_CONSTANTS에 대해서만 _ char을 사용하지만 변수와 메소드 이름에는 사용하지 않는다. – GhostCat

+1

그리고 다음 질문에 대해 : 우리가 당신을 도울 시간을 보내길 원한다. 그래서 당신은 소스 코드를 적절하게 포맷 할 시간을 보내시기 바랍니다. 그리고 마지막으로 ** 삽입에 관한 ** 두 가지 ** 공용 메소드를 갖는 것은 단순히 매우 혼란스러운 인터페이스입니다 (내가 처음에 잘못된 대답을했던 것처럼 보였을 것입니다). 문제는 : 당신의 코드는 ** 읽기 힘들다 **; 비록 그렇게 단순해야만합니다. 마지막으로 ** 관련 작업 후에 코드에 print 문을 넣기 만하면 쉽게 ** 디버깅 할 수 있습니다. 또는 ** 디버거 **를 실행하여. – GhostCat

답변

3

5. insert_node(root.left,n) 호출은 새로운 노드를 생성 출력한다, 그러나 새롭게 생성 된 노드에 대한 참조가 저장되어 있지 않은 트리 자체가 효과적으로 변경되지 않는다는 것을 의미합니다. 참조는 새로 생성 된 노드의 부모 노드에 저장되어야합니다. 노드가 오른쪽 하위 트리에 삽입되는 경우에도 마찬가지입니다.

+0

감사 Codor. 아래 코드를 변경하고 제대로 삽입 및 인쇄하고 있습니다. –

+0

공개 insert_node 노드 (노드 R, INT 않음) { \t \t 경우 (R == NULL) { \t \t \t 노드 N1 = 신규 노드 (N); \t \t \t return n1; \t \t한다} else \t \t 경우 (root.data <= N) { \t \t \t root.right = insert_node (root.right, N); 다른 \t \t \t \t } { \t \t \t root.left = insert_node (root.left, N); \t \t} \t \t return r; –

+1

@varunjana 해보세요. 그의 대답이 우회전이라면 간단히 받아들입니다. 코드를 읽을 때 읽을 수없는 주석으로 채울 필요가 없습니다. – GhostCat

0

Codor에서 언급 한대로 새 노드를 삽입 할 때 왼쪽 노드 또는 오른쪽 노드에 추가 할 것인지 여부와 같이 부모 노드의 참조를 저장하지 않습니다. 항상 새로운 노드를 생성합니다. 삽입 메소드에서 코드 작업을하기 위해 약간의 변경을했습니다.

public void insert(int data){ 
     //creating root node if root node itself is null 
     if(root==null){ 
      root =new Node(data); 
     } else { 
      root=insert_node(root, data, null, null); 
     } 
     //System.out.println("after insert root data is " + root.data); 
    } 
    public Node insert_node(Node node, int n, String dir, Node parent){ 
     //traverse and insert in proper nodes 
     //assign left or right child based on some logic i have taken direction as string here. 
     if(node == null) { 
      Node n1 = new Node(n); 
      if(dir.equalsIgnoreCase("left")) { 
       parent.left = n1; 
      } else { 
       parent.right = n1; 
      } 
     } 
     else if(root.data<=n){ 
      parent = root; 
      insert_node(root.right, n, "right", parent); 
     } 
     else{ 
      parent = root; 
      insert_node(root.left, n, "left", parent); 
     } 
     return root; 
    } 
+0

Asif, should should be : –

+0

'code' 노드.data <= n –

+0

'public 노드 insert_node (노드 노드, int n, char 디렉토리, 노드 부모) { \t \t if (node ​​== null) { \t 노드 n1 = 새 노드 (n); \t if (dir == 'l') { \t parent.left = n1; \t} else { \t parent.right = n1; \t \t }} 또 \t 경우 (node.data <= N) {= \t 부모 노드; \t insert_node (node.right, n, 'r', parent); \t} \t else { \t parent = node; \t insert_node (node.left, n, 'l', parent); \t} \t return root; –

관련 문제