当前位置: 首页 > 知识库问答 >
问题:

如何创建一个方法,获取前一个节点使用二进制搜索树在Java?

钱睿范
2023-03-14

我正在研究一种方法,使用二叉搜索树获取前一个节点。现在我想我明白了,但是我正在努力处理我的if语句。

说明如下:getPrevNode(BSTNode)方法应该在树中找到参数前面的节点。这是我正在使用的算法。

如果节点有左子节点,向下移动左子树以获得最大节点

•否则,如果节点有父节点,我们需要按如下方式向上移动树:

•如果节点是正确的子节点,则返回其父节点

•如果节点是左边的子节点,则向上移动树,直到您是右边的子节点,并返回其父节点

如果你到达了根,并且从来都不是正确的孩子,那么就没有以前的节点

请注意,这也是一种辅助方法。因此,这里是我的代码,我到目前为止,遵循这个算法。

 private BSTNode<E> getPrevNode(BSTNode<E> node)
{
    if(node.left != null)
    {
        return getPrevNode(node.left);
    }
    else if(node.parent != null)
    {
        if(node == node.right)
        {
            return node.parent;
        }
        else if(node == node.left)
        {
            return node.parent;
        }
    }
    return getPrevNode(node);
}

现在我知道它不准确,但这就是为什么我要问。我会尝试给出一些关于这段代码的信息,但我会留下一些方法,因为我不希望它太长。

public class BinarySearchTree<E extends Comparable<E>>
{
private BSTNode<E> root; // root of overall tree
private int numElements;
private BSTNode<E> first;
// post: constructs an empty search tree
public BinarySearchTree()
{
    this.root = null;
    this.numElements = 0;
}
private BSTNode<E> getPrevNode(BSTNode<E> node)
{
    if(node.left != null)
    {
        return getPrevNode(node.left);
    }
    else if(node.parent != null)
    {
        if(node == node.right)
        {
            return node.parent;
        }
        else if(node == node.left)
        {
            return node.parent;
        }
    }
    return getPrevNode(node);
}
 public class Iterator
{
    private BSTNode<E> currentNode;

    public Iterator()
    {
        currentNode = first;
    }

    public boolean hasNext()
    {
        return currentNode != null;
    }

    public E next()
    {
        E value = currentNode.data;
        currentNode = currentNode.next;
        return value;
    }
}
private static class BSTNode<E>
{
    public E data;
    public BSTNode<E> left;
    public BSTNode<E> right;
    public BSTNode<E> parent;
    public BSTNode<E> next;

    public BSTNode(E data)
    {
        this(data, null, null, null, null);
    }

    public BSTNode(E data, BSTNode<E> left, BSTNode<E> right, BSTNode<E> parent, BSTNode<E> next)
    {
        this.data = data;
        this.left = left;
        this.right = right;
        this.parent = parent;
        this.next = next;
    }
 }
}

我希望这些信息有用。

共有3个答案

麹培
2023-03-14

这里有一个代码更少的解决方案。

private BSTNode<E> getPrevNode(BSTNode<E> node, int val) {
    if (node == null) return null;
    BSTNode<E> prev = null;
    while (node != null) {
       if (val < node.data) {
          prev = node;
          node = node.left;
       } else if (val > node.data) {
          prev = node;
          node = node.right;
       } else {
          break;
       }
    }
    return node != null ? prev : null;
}
董和风
2023-03-14

利亚姆的答案到目前为止也是正确的,不过这里有另一种解决方法。

private BSTNode<E> getPrevNode(BSTNode<E> node)
{
    if(node.left != null)
    {
        node = node.left;
        while(node.right != null)
        {
            node = node.right;
        }
        return node;
    }
    else if(node.parent != null)
    {
        if(node.parent.right == node)
        {
            return node.parent;
        }
        if(node.parent.left == node)
        {
            while(node.parent != null && node.parent.left == node)
            {
                node = node.parent;
            }
            if(node == root)
            {
              return null;
            }
            else
            {
              return node.parent;
            }
        }
    }
    return null;
}
孟浩然
2023-03-14

试试这个:

private BSTNode<E> getPrevNode(BSTNode<E> node) {

    if(node.left != null) {
        node = node.left;
        while(node.right != null) {
            node = node.right;
        }
        return node;
    } else if(node.parent != null) {

        // If the node is a right child, return its parent
        if(node.parent.right == node) {
            return node.parent;
        }

        // If the node is a left child, move up the tree 
        // until you are a right child and return its parent
        if(node.parent.left == node) {

            while(node.parent.right != node) {

                // If you reach the root and are never a right child, no previous node return null
                if(node.parent == root) {
                    return null;
                }
                node = node.parent; 
            }
            return node.parent;

        }           
    }

    return null;
}
 类似资料:
  • 我对如何在二叉查找树中排列节点的顺序有点困惑。左边的二叉查找树中的子树节点能比根节点大吗? 例如,以下内容会是二叉搜索树吗? 上面让我困惑的是1(3)的右子树是否可以大于原始根节点(2)。

  • 目前,我在理解如何在没有传递节点时从二进制搜索树中删除节点时遇到了一个问题。我有两个类,BSTSet和BSTNode,每个类都有一个remove方法。。 当我被传递一个节点时,我理解删除方法,但当我在根上调用remove方法并试图从node类中删除节点时,我不知道从何处开始。有人能告诉我吗?谢谢如果您想了解更多信息,请询问。

  • 我用java创建了一个二进制搜索树,允许用户向该树添加节点 这是我在java中实现的二叉树,它在创建时接受根节点,然后自动计算出它应该将子节点添加到树的左侧或右侧。 但是当我尝试使用

  • 我在C中实现了一个二进制搜索树。 对于delete方法,除了最后一种情况外,其他情况都可以使用,即唯一的树是父树,并且它指向两个空的子树。现在的问题是:我希望在删除子树后,打印出父树的左子树和右子树等于什么。它们和父项都应该为NULL,但是当我试图输出这些值时,我得到了一个状态访问冲突。 下面是有关删除的代码。我希望删除父节点,并设置树- 主要:

  • 问题内容: 首先,我必须说我发现它是一个非常好的解析器,并且在与其他解析器进行比较时,我认为它非常强大。 给出以下代码: 如果我想找到回合1和门1 的节点,请在此处: 我将这样做: 如果我想要第一回合和第一回合的节点,则: 但如何使用一个循环,因为我不知道多少我做我的,这意味着我怎么能这样使用一个循环,其中每个迭代我取回3(我的意思是,和值)的值更值节点!? 要求这样做的原因是: 我不知道我有多少

  • 问题内容: 我上大学期间一直在通过编码算法来练习Java。我编码的算法之一是二进制搜索: 我真的希望能够编写一种更简洁,有效的二进制搜索算法,以替代我编写的代码。我已经看到了如何使用递归的示例,例如使用我理解的数字进行阶乘时。但是,当编码这种复杂性的东西时,我对如何利用它感到困惑。因此,我的问题是编码二进制搜索算法时如何应用递归。如果您有什么技巧可以完善我的递归技能,即使它与二进制搜索无关,那么请