2012-04-28 18 views
6
class Node 
{ 
    public int data; 
    public Node left, right; 

    public Node(int data) 
    { 
     this.data = data; 
     left = null; 
     right = null; 

    } 
} 

class BinaryTreeImp 
{ 
    Node root; 
    static int count = 0; 

    public BinaryTreeImp() 
    { 
     root = null; 

    } 
    public Node addNode(int data) 
    { 
     Node newNode = new Node(data); 

     if (root == null) 
     { 
      root = newNode; 

     } 
     count++; 
     return newNode; 


    } 

    public void insertNode(Node root,Node newNode) 
    { 
     Node temp; 
     temp = root; 

     if (newNode.data < temp.data) 
      { 
       if (temp.left == null) 
       { 
        temp.left = newNode; 

       } 

       else 
       { 
        temp = temp.left; 
        insertNode(temp,newNode); 

       } 
      } 
      else if (newNode.data > temp.data) 
      { 
       if (temp.right == null) 
       { 
        temp.right = newNode; 

       } 

       else 
       { 
        temp = temp.right; 
        insertNode(temp,newNode); 
       } 
      } 
     } 


    public void displayTree(Node root) 
    { 
     Node temp; 
     temp = root; 

     if (temp == null) 
      return; 
      displayTree(temp.left); 
      System.Console.Write(temp.data + " "); 
      displayTree(temp.right); 


    } 

    static void Main(string[] args) 
    { 
     BinaryTreeImp btObj = new BinaryTreeImp(); 
     Node iniRoot= btObj.addNode(5); 


     btObj.insertNode(btObj.root,iniRoot); 
     btObj.insertNode(btObj.root,btObj.addNode(6)); 
     btObj.insertNode(btObj.root,btObj.addNode(10)); 
     btObj.insertNode(btObj.root,btObj.addNode(2)); 
     btObj.insertNode(btObj.root,btObj.addNode(3)); 
     btObj.displayTree(btObj.root); 

     System.Console.WriteLine("The sum of nodes are " + count); 
     Console.ReadLine(); 

    } 
} 

Este es el código para el código implementation.The funciona bien, pero si en la función displayTree, lo cambio porárbol de búsqueda binaria en C# Implementación

public void displayTree(Node root) 
{ 
    Node temp; 
    temp = root; 

    while(temp!=null) 
    { 
     displayTree(temp.left); 
     System.Console.Write(temp.data + " "); 
     displayTree(temp.right); 
    } 

} 

es causado un bucle infinito. No entiendo qué está causando esto. También me gustaría saber si hay una mejor manera de implementar una BST en C#.

+1

Vote to close: Hacer extraños para detectar errores en su código mediante inspección no es productivo. Debe identificar (o al menos aislar) el problema utilizando un depurador o imprimir instrucciones, y luego volver con una pregunta más específica (una vez que la haya reducido a una línea de 10 [caso de prueba] (http://sscce.org)). –

Respuesta

5

No estoy seguro de por qué es necesario este bucle, pero respondiendo a la pregunta:

while(temp!=null) 
{ 
    displayTree(temp.left); 
    System.Console.Write(temp.data + " "); 
    displayTree(temp.right); 
} 

este código comprueba si temp no es null, pero nunca llegará a ser nula, causar dentro del bucle que acto solo en las hojas de la temperatura. Es por eso que tienes un bucle infinito.

+0

Si el temp.left.left es nulo, ¿no volvería simplemente al bucle temp.left? – YuNo

+0

no saltará en 'while', pero allí donde ya está * en *, no saltará. – Tigran

+0

¡Oh bien! Muchas gracias :) – YuNo

5

No es necesario un bucle while ni una variable temp, dejar que la recursividad hacer el trabajo por usted:

public void displayTree(Node root) 
{ 
    if(root == null) return; 

    displayTree(root.left); 
    System.Console.Write(root.data + " "); 
    displayTree(root.right); 
} 
+0

Sí, lo corregí de la misma manera más tarde. gracias :) – YuNo

0

temperatura se establece en la raíz al principio, y después de que su valor no cambia nunca

¿qué pasa con la reescritura de su función como

public void displayTree(Node root) 
{ 
    if (root == null) 
     return; 
    displayTree(root.left); 
    Console.Write(...); 
    displayTree(root.right); 
} 
+0

Cambia cuando desde el interior del bucle, se llama a la función displayTree() reemplazando efectivamente el valor de root como temp.left o temp.right. – YuNo

0

probar este

 public void displayTree(Node root) 
    { 
     Node temp; 
     temp = root; 

     if (temp != null) 
     { 
      displayTree(temp.left); 
      Console.WriteLine(temp.data + " "); 
      displayTree(temp.right); 

     } 
    } 
0

Estaba pensando que también podría utilizar la recursividad para la función de agregar. Podría verse algo como esto

 private void Add(BinaryTree node, ref BinaryTree rootNode) 
    { 
     if (rootNode == null) 
     { 
      rootNode = node; 
     } 
     if (node.value > rootNode.value) 
     { 
      Add(node, ref rootNode.right); 
     } 
     if (node.value < rootNode.value) 
     { 

     Add(node, ref rootNode.left); 
     } 
    } 
Cuestiones relacionadas