12
votes

Comment rechercher un nœud dans un arbre binaire et le retourner?

J'essaie de rechercher un nœud dans un arbre binaire et de retour au cas où il est là, sinon, retourne null. Au fait, la classe de nœud a un nom de méthode () qui renvoie une chaîne avec son nom ... ce que j'ai jusqu'à présent:

private Node search(String name, Node node){

     if(node != null){
         if(node.name().equals(name)){
            return node;
         }

      else{
         search(name, node.left);
         search(name, node.right);
      }
    }
    return null;
}


2 commentaires

Avez-vous essayé de l'exécuter pour voir si les résultats sont corrects? Pourquoi pensez-vous que cela pourrait pas correct?


L'as tu essayé? Faire un cas d'essai est l'une des parties les plus importantes du codage.


13 Réponses :


0
votes

Cela pourrait être meilleur:

if(node != null){
    if(node.name().equals(name)){
        return node;
    }
    else {
        Node tmp = search(name, node.left);
        if (tmp != null) { // if we find it at left
            return tmp; // we return it
        }
        // else we return the result of the search in the right node
        return search(name, node.right);
    }
}
return null;


2 commentaires

renvoyer null; À la fin, peut donner un avertissement de compilation (en fonction de la configuration) car c'est un code inaccessible.


Vous avez raison, a raté la grande déclaration si elle est au sommet. mon erreur.



0
votes

Vous devriez retourner quelque chose s'il est trouvé dans Node.Left ou Node.Right. Donc, le Bloc Block devrait être quelque chose comme ça:

 else{
     Node temp = search(name, node.left);
     if (temp != null) return temp;
     temp = search(name, node.right);
     if (temp != null) return temp;
  }


1 commentaires

Un instruction NULL NULL est nécessaire à la fin de sinon Body o gérer le boîtier si la clé n'est pas trouvée.



0
votes

Vous ne faites rien avec le résultat des appels récursifs xxx


0 commentaires

29
votes

Vous devez vous assurer que vos appels récursifs à la recherche de retour si le résultat n'est pas NULL.

Quelque chose comme ça devrait fonctionner ... P>

private Node search(String name, Node node){
    if(node != null){
        if(node.name().equals(name)){
           return node;
        } else {
            Node foundNode = search(name, node.left);
            if(foundNode == null) {
                foundNode = search(name, node.right);
            }
            return foundNode;
         }
    } else {
        return null;
    }
}


3 commentaires

Vous avez oublié un point-virgule après le retour de Foundnode;


Fantastique, cela fonctionne comme un charme, mais j'ai trouvé ce fil parce que j'avais des problèmes avec ma propre méthode récursive ... La note de vous assurer que vous renvoyez NULL si le résultat n'est pas sauvé ma journée


Agréable! C'est un peu un bender-esprit mais ça marche un régal!



0
votes
Boolean FindInBinaryTreeWithRecursion(TreeNode root, int data)
{
    Boolean temp;
    // base case == emptytree
    if (root == null) return false;
    else {
        if (data == root.getData())  return true;
        else { // otherwise recur down tree
            temp = FindInBinaryTreeWithRecursion(root.getLeft(), data);
            if (temp != true) 
                return temp;
            else
                return (FindInBinaryTreeWithRecursion(root.getRight(), data));  
        }
    }
}

0 commentaires

0
votes
public static TreeNode findNodeInTree(TreeNode root, TreeNode nodeToFind) {
  if (root == null) {
    return null;
  }

  if (root.data == nodeToFind.data) {
    return root;
  }

  TreeNode found = null;
  if (root.left != null) {
    found = findNodeInTree(root.left, nodeToFind);
    if (found != null) {
      return found;
    }
  }

  if (root.right != null) {
    found = findNodeInTree(root.right, nodeToFind);
    if (found != null) {
      return found;
    }
  }
  return null;
}

0 commentaires

3
votes
public Node findNode(Node root, Node nodeToFind) {
    Node foundNode = null;
    Node traversingNode = root;

    if (traversingNode.data == nodeToFind.data) {
        foundNode = traversingNode;
        return foundNode;
    }

    if (nodeToFind.data < traversingNode.data
            && null != traversingNode.leftChild) {
        findNode(traversingNode.leftChild, nodeToFind);
    } else if (nodeToFind.data > traversingNode.data
            && null != traversingNode.rightChild) {
        findNode(traversingNode, nodeToFind);
    }

    return foundNode;

}

0 commentaires

0
votes

En fait, essayez d'éviter la récursivité. Si vous avez une grande structure d'arborescence, vous obtiendrez une erreur de dépassement de pile. Au lieu de cela, vous pouvez utiliser une liste: xxx


0 commentaires

1
votes

Étant donné que la langue n'a pas beaucoup d'importance pour cette question, voici ce qu'il ressemble à C # avec une traversée de pré-commande: xxx


0 commentaires

0
votes
public static boolean findElement(Node root, int value) {
    if (root != null) {
        if (root.data == value) {
            return true;
        } else {
            return findElement(root.left, value) || findElement(root.right, value);
        }
    }
    return false;
}

0 commentaires

0
votes
    public TreeNode searchBST(TreeNode root, int val) {
        if(root==null || root.val==val) return root;
        TreeNode found = (val < root.val) ? searchBST(root.left,val) : searchBST(root.right,val);
        return found;
    }
View Code on GitHub

1 commentaires

Vous devriez ajouter une explication à votre réponse.



0
votes
private TreeNode findX(TreeNode root, int x) {
    if(root == null) return null;
    if(root.val == x) return root;

    TreeNode left = findX(root.left,x);
    TreeNode right = findX(root.right,x);

    if(left == null) return right;
    return left;

}

0 commentaires

0
votes
Node* search(Node* root,int key){
   
   // If key is found or is NULL     
   if (root == NULL || root->key == key) 
      return root;

   if (root->key < key) 
      return search(root->right, key); 
   
   return search(root->left, key);
} 

0 commentaires