3

在二叉搜索树的以下代码中:

template <class TKey>
class bst<TKey>::node *bst<TKey>::insert(node *T, TKey &key)
{
if (T == NULL) {
  T = new node;
  T->key = key;
} else if (T->key == key) {
  cout << "key " << key << " already in tree" << endl;
} else {

    int dir = T->key < key;
    T->link[dir] = insert(T->link[dir], key);

}

return T;
}

我很困惑是什么线

int dir = T->key < key;

是在做。我可以理解“int dir = T->key”,虽然这当然没有意义,但我以前没有见过以这种方式使用的“<”运算符。有什么线索吗?

4

5 回答 5

9

T->key < key是一个条件。它将评估为truefalse。如果它评估为truedir将获得价值1,否则将获得价值0

int dir = T->key < key;

是写作的简写形式

int dir;
if(T->key < key)
    dir = 1;
else
    dir = 0;

当 aboolean被赋值给 aint时,它会得到对应于or的值0or 。1falsetrue

于 2012-11-18T05:18:52.590 回答
6

如果运算符没有重载,则它具有通常的含义;它评估为truefalse。这是一种bool类型,因此可以隐式转换为int.

但是,如果TKey是一个类并重载它,或者有一个全局重载,那么除非我们看到代码,否则我们不知道它做了什么。

于 2012-11-18T05:19:40.710 回答
0

<如果第一个操作数小于第二个操作数,则返回 1,否则返回 0。

于 2012-11-18T05:19:04.283 回答
0

<运算符是一个布尔比较运算符 - 即它评估0条件是否为假,以及1条件是否为真。它通常用在条件句中,但直接使用返回值是完全有效的。在这种情况下,如果 的值T->key小于的值,则为keydir否则为。1dir0

于 2012-11-18T05:19:44.587 回答
0

好吧,由于二叉搜索树在左侧存储小于根的值而在右侧存储更大的值,因此您需要选择插入将发生的方向。为此,您将键与当前节点的值进行比较。此比较的结果存储在 dir 变量中。因此,如果 key 小于 T 的值,则 dir 得到 1,它表示 link[] 中的左侧,它保存指向节点 T 的左右分支的指针。然后使用 T 的左节点递归地插入。为什么你在那里做一个比较。只是看看我们是否必须将元素插入到当前节点的右侧或左侧。

于 2012-11-18T05:22:42.753 回答