Как искать узел в двоичном дереве и возвращать его?

#java #binary-tree #treenode

#java #binary-tree #treenode

Вопрос:

Я пытаюсь выполнить поиск узла в двоичном дереве и вернуть, если он там есть, в противном случае верните null. Кстати, класс node имеет метод name(), который возвращает строку с его именем…Что у меня есть на данный момент, так это:

 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;
}
  

Правильно ли это??

Комментарии:

1. Вы пробовали запускать его, чтобы проверить, верны ли результаты? Почему вы думаете, что это может быть не правильно?

2. Вы пробовали это? Создание тестового примера является одной из наиболее важных частей кодирования.

Ответ №1:

Вам нужно убедиться, что ваши рекурсивные вызовы search возвращают, если результат не равен null.

Что-то вроде этого должно сработать…

 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;
    }
}
  

Комментарии:

1. Вы забыли точку с запятой после возврата foundNode;

2. Фантастика, это работает как шарм, но я нашел эту ветку, потому что у меня были проблемы с моим собственным рекурсивным методом … примечание о том, чтобы вы возвращали null, если результат не равен null, спасло мне день

3. Приятно! Это немного напрягает разум, но работает великолепно!

Ответ №2:

 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
            amp;amp; null != traversingNode.leftChild) {
        findNode(traversingNode.leftChild, nodeToFind);
    } else if (nodeToFind.data > traversingNode.data
            amp;amp; null != traversingNode.rightChild) {
        findNode(traversingNode, nodeToFind);
    }

    return foundNode;

}
  

Ответ №3:

Поскольку язык не имеет большого значения для этого вопроса, вот как это выглядит в C # при обходе предварительного заказа:

 public static Node FindNode(Node n, int nodeValue)
{
    if (n == null) return null;
    if (n.Value == nodeValue) return n;
    return FindNode(n.Left, nodeValue) ?? FindNode(n.Right, nodeValue);
}
  

Ответ №4:

вы должны вернуть что-то, если оно найдено в node.слева или node.right итак, блок else должен быть чем-то вроде этого:

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

Комментарии:

1. В конце return null тела требуется else инструкция, чтобы обработать случай, если ключ не найден.

Ответ №5:

вы ничего не делаете с результатом рекурсивных вызовов

 Node res = search(name, node.left);
if(res!=null)return res;
res = search(name, node.right);
if(res!=null)return res;
  

Ответ №6:

Это могло бы быть лучше:

 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;
  

Комментарии:

1. возвращает null; в конце может выдавать предупреждение о компиляции (в зависимости от конфигурации), поскольку это недоступный код.

2. вы правы, пропустили большой оператор if вверху. моя ошибка.

Ответ №7:

 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));  
        }
    }
}
  

Ответ №8:

 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;
}
  

Ответ №9:

На самом деле, старайтесь избегать рекурсивности. В случае, если у вас большая древовидная структура, вы получите ошибку переполнения стека. Вместо этого вы можете использовать список:

 private Node search(String name, Node node){
    List<Node> l = new ArrayList<Node>();
    l.add(node);
    While(!l.isEmpty()){
        if (l.get(0).name().equals(name))   
            return l.get(0);
        else {
            l.add(l.get(0).left);
            l.add(l.get(0).right);
            l.remove(0);
        }           
    }   
    return null;
}
  

Ответ №10:

 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;
}
  

Ответ №11:

     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;
    }
  

Посмотреть код на GitHub

Комментарии:

1. Вы должны добавить некоторое объяснение к своему ответу.

Ответ №12:

 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;

}
  

Ответ №13:

 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);
} 
  

Ответ №14:

Для ребят с C :

 //search in a binary tree | O(n)
TreeNode* searchBST(TreeNode* root, int val) {
    if(!root) return root;
    if(root->val == val) return root;

    TreeNode* temp = searchBST(root->left, val);
    if(!temp){
        temp = searchBST(root->right, val);
    }
    return temp;
}

//search in a BST | O(logn)
TreeNode* searchBST(TreeNode* root, int val) {
    if(!root) return root;
    if(root->val == val) return root;
    if(val < root->val) return searchBST(root->left, val);
    return searchBST(root->right, val);
}