Как найти значение в двоичном дереве - PullRequest
0 голосов
/ 13 марта 2020

У меня есть двоичное дерево, как на рисунке ниже, я хочу реализовать метод с именем findNode, чтобы вернуть узел, содержащий значение, введенное в качестве параметра. Например: findNode(8)=8, findNode(13)=13. Я пытался изменить этот код, но он не работал:

    class Node {
        Node left, right;
        int value;

        public Node findNode(int value) {
            Node focusNode = root;
            if (focusNode == null) {
                return null;
            }
            while (focusNode.value != value) {
                // If we should search to the left
                if (value < focusNode.value) {
                    // Shift the focus Node to the left child
                    focusNode = focusNode.left;
                } else {
                    // Shift the focus Node to the right child
                    focusNode = focusNode.right;
                }
                return focusNode;
            }
        }
    }

tree example

Ответы [ 3 ]

1 голос
/ 13 марта 2020

Посмотрите, поможет ли это. Вы не можете по умолчанию влево или вправо, но нужно проверить их явно. Нулевая ситуация решается в то время как l oop.

    public Node findNode(int value) {
        Node focusNode = root;
        while (focusNode != null) {
            // If we should search to the left
            if (value < focusNode.value) {
                // Shift the focus Node to the left child
                focusNode = focusNode.left;
            } else if (value > focusNode.value) {
                // Shift the focus Node to the right child
                focusNode = focusNode.right;
            } else {
                // Found!!
                return focusNode;
            }
        }
        return null;
    }
0 голосов
/ 13 марта 2020

ваш root либо не определен, либо равен нулю каждый раз. код ниже будет работать как положено.

class Node
{
    int value;
    Node left, right;

    public Node(int item)
    {
        value = item;
        left = right = null;
    }
}


public class BinaryTree {
    Node root;

    public Node findNode(int value) {
        Node focusNode = root;
        if (focusNode == null){
            return null;
        }

        while (focusNode.value!= value) {

            // If we should search to the left

            if (value< focusNode.value) {

                // Shift the focus Node to the left child

                focusNode = focusNode.left;

            } else {

// Shift the focus Node to the right child

                focusNode = focusNode.right;

            }


        }

        return focusNode;

    }
0 голосов
/ 13 марта 2020

Вот более чистый подход:

   class Node {
        Node left, right;
        int value;

        public static Node findNode(Node current, int value) {
            if (current == null)
                return null;
            if (current.value == value)
                return current;
            if (current.value < value) 
                return findNode(current.left, value);
            else 
                return findNode(current.right, value);
        }
    }
...