#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;
}
Комментарии:
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);
}