2017-03-08 4 views
1

Code:Finding Knotenwert in binärer Suchbaum C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    public class Node 
    { 
     public int Value { get; set; } 

     public Node Left { get; set; } 

     public Node Right { get; set; } 

     public Node(int value, Node left, Node right) 
     { 
      Value = value; 
      Left = left; 
      Right = right; 
     } 
    } 

    public class BinarySearchTree 
    { 
     public static bool Contains(Node root, int value) 
     { 
      bool status = false; 
      if (root == null) 
      { 
       status = false; 
      } 
      else if (root.Value == value) 
      { 
       status = true; 
       return true; 
      } 
      else if (root.Value < value) 
      { 
       Contains(root.Right, value); 
      } 
      else 
      { 
       Contains(root.Left, value); 
      } 
      return status; 

     } 

     public static void Main(string[] args) 
     { 
      Node n1 = new Node(1, null, null); 
      Node n3 = new Node(3, null, null); 
      Node n2 = new Node(2, n1, n3); 

      Console.WriteLine(Contains(n2, 3)); 
      Console.ReadLine(); 
     } 
    } 
} 

Frage: Auch ich habe diesen Code versucht, das Debuggen! Aber es zeigt immer falsch als Antwort an. Lass mich wissen, wo ich falsch liege. Wenn ich den Code debugge, ändert sich der Status in "true", aber er führt immer noch andere Dinge aus und ändert sich schließlich in "false". Lassen Sie mich wissen, wohin ich gehe

Antwort

2

Es scheint, Sie vermissen die status Zuordnung von den Contains Anrufe: Sie sollten Ergebniswert status zuweisen

status = Contains(root.Right, value); 

und

status = Contains(root.Left, value); 
+0

Vielen Dank! Gelöst! – RAS

2

In Ihrem rekursiven Anruf berechnen Sie Contains für untergeordnete Knoten, aber Sie tun nichts damit.

public static bool Contains(Node root, int value) 
{ 
    bool status = false; 
    if (root == null) 
    { 
     status = false; 
    } 
    else if (root.Value == value) 
    { 
     status = true; 
     return true; 
    } 
    else if (root.Value < value) 
    { 
     status = Contains(root.Right, value); 
    } 
    else 
    { 
     status = Contains(root.Left, value); 
    } 
    return status; 
} 

Besser ist es, diese status Variable zu vermeiden und direkt verwenden return Aussage:

public static bool Contains(Node root, int value) 
{ 
    if (root == null) 
    { 
     return false; 
    } 
    else if (root.Value == value) 
    { 
     return true; 
    } 
    else if (root.Value < value) 
    { 
     return Contains(root.Right, value); 
    } 
    else 
    { 
     return Contains(root.Left, value); 
    } 
} 
+0

Perfekt! Das hat mein Problem gelöst. Danke vielmals! Ich dachte, wenn ich den Anruf mache, würde es den Wert in der vorherigen if-Anweisung überprüfen und wenn eine Übereinstimmung gefunden wird, wird es dem Status zugewiesen werden! – RAS

+0

@RAS Sie sind willkommen –