在java中查找二进制搜索树的前身和后继

时间:2017-08-29 03:57:29

标签: java tree binary-tree binary-search-tree

我的项目希望我打印出二元搜索树的前身和后继者。赋值要求我将节点的数据作为参数传递。当我尝试打印出给定节点数据的前身时,它给了我0.我不知疲倦地尝试如何解决问题但没有发现在哪里。希望你能找到问题所在。

以下是方法:

  public void findPredecessor(Node root, int data)
  {
    int predecessor = 0;
    if(root != null)
    {
        if(root.data == data)
        {
            if(root.left != null)
            {
                Node n = root.left;
                while(n.right != null) n = n.right;
                predecessor=  n.data;
            }
        }
        else if(root.data < data)
        {
            predecessor = root.data;
            findPredecessor(root.left, data);
        }
    }
    System.out.print(predecessor);
}

public void printPredecessor(int data)
{
    findPredecessor(root, data);
}

2 个答案:

答案 0 :(得分:0)

这是我想到的正确方法的伪代码:

Shape -> Shape -> Bool
  • 如果root为NULL ,则返回

  • 如果找到密钥

    mappend x mempty == mappend mempty x == x

    返回

  • 如果 键较小,则根节点将后续设置为root
     并递归搜索到左子树

    其他 将前任设置为root 并递归搜索到  右子树

编辑:如果后继者或前任者返回null print null。

实施例

Data.Monoid

希望它有所帮助!

答案 1 :(得分:0)

您可以使用inOrder遍历在二叉搜索树中找到节点的前导和后继。 inOrder遍历的基本结构是:

inOrder(Node n)
  if (n == null) return;
  inOrder(n.left)
  visit(n)
  inOrder(n.right)

在这种情况下,当我们访问一个节点时,我们想要跟踪我们已经看到的前任,匹配节点和后继节点。这是基本逻辑:

visit(n)
  if n.val == searchVal
    match = n
  else if match == null
    predecessor = n
  else if successor == null
    successor = n;

这里有一些Java代码。我使用一个简单的3元素数组来存储前任,匹配和后继。

class Node
{
  int val;
  Node left, right;
}

static void inOrder(Node n, int val, Node[] seq)
{
  if(n == null) return;

  inOrder(n.left, val, seq);

  if(n.val == val) 
    seq[1] = n;
  else if(seq[1] == null)
    seq[0] = n;
  else if(seq[2] == null)
    seq[2] = n;

  inOrder(n.right, val, seq);   
}

public static void main(String[] args)
{
  Node root = buildTree();
  int searchVal = Integer.parseInt(args[0]);

  Node[] seq = new Node[3];
  inOrder(root, searchVal , seq);
  System.out.println("Predecessor: " + seq[0]);
  System.out.println("Match: " + seq[1]);
  System.out.println("Successor: " + seq[2]);
}