二叉搜索树中的楼层实现

时间:2014-12-08 16:12:49

标签: algorithm data-structures binary-search-tree

考虑Robert Sedgewick在booksite

中的这一陈述
如果给定的密钥小于BST根的密钥,则密钥的底限(BST中的最大密钥小于或等于密钥)必须在左子树中。如果key大于root的密钥,那么key的floor可以在右子树中,但只有在右子树中有一个小于或等于key的键时;如果不是(或者如果密钥等于根的密钥),那么根的密钥就是密钥的底限。

我非常困惑当密钥大于根时会发生什么,特别是当他说:"但只有在右子树中有小于或等于密钥的密钥时才会出现#34; 。我认为他的意思是,如果密钥小于根,则密钥肯定在左子树中。另一方面,如果密钥更严格,则密钥可以是"在正确的子树中,所以可能在右侧子树上找不到密钥。并基于他的floor()方法:

public Key floor(Key key)
{
   Node x = floor(root, key);
   if (x == null) return null;
   return x.key;
}

private Node floor(Node x, Key key)
{
   if (x == null) return null;
   int cmp = key.compareTo(x.key);
   if (cmp == 0) return x;
   if (cmp < 0)  return floor(x.left, key);
   Node t = floor(x.right, key);
   if (t != null) return t;
   else           return x;
}

他确实检查了正确的子树,但没有检查左子树。但我完全不能提出一个例子,其中密钥大于根,但小于右子树中的密钥。我真的认为这是不可能的。我错过了一些东西。任何人都可以解释我错过的东西吗?

2 个答案:

答案 0 :(得分:1)

如果您有一棵树(请原谅我的ASCII艺术技巧)

  3
 / \
1   5

你正在寻找楼层(4),然后

  1. 搜索键大于root
  2. 右子树中没有小于搜索键的键,所以
  3. 结果是根密钥(3)。

答案 1 :(得分:0)

一个简单的解决方案:

            int FloorInBST(Node* root,int data)
            {
              if(root == NULL)
              {
                  return -1;//when MinNode of tree is greater than the input value
              }
              if(root->data == data) return data;

              if(root->data > data)
              {
                  return FloorInBST(root->left, data);//MUST be in left subtree 
              }
              else if (root->data < data)
              {
                  //MAY be in right subtree OR root itself
                  int floor = FloorInBST(root->right, data);
                  return (root->data >= floor ? root->data:floor);
              }
            }