则:o.left->value < o.value,o.right->value > o.value。在这里不考虑重复的元素,则对于每一个节点而言,这个节点的左孩子结点小于这个节点,右孩子节点大于这个节点。struct Node{
Node* left;
Node* right;
int value;
int cmp(int x){
if (value == x) return -1;
return value < x;
}
};
不过,这个过程也可以直接用循环迭代实现。循环的迭代更为高效,而且不会爆栈,所以可以处理更大规模的数据了,代码如下:const int NOT_FOUND = -1; Node* find(Node* o,int x){ if (o == NULL) return NOT_FOUND; int d = o -> cmp(x); if (d == -1) return o; if (d == 1) return find(o -> left,x); //左子树 if (d == 0) return find(o -> right,x); //右子树 }
const int NOW_FOUND = -1; Node* find(Node* o,int x) { while (o != NULL){ int d = o -> cmp(x); if (d == -1) break; if (d == 1) o = o -> left; if (d == 0) o = o -> right; } return (o == NULL ? NOT_FOUND : o); }
因为是普通的二叉排序树,所以说没有那么复杂。void insert(Node* &root,int x){ if (root == NULL){ root = new Node(); root -> value = x; return; } int d = root -> cmp(x); if (d == 0) insert(root -> right,x); else if (d == 1) insert(root -> left,x); else if (d == -1) insert(root -> left,x); }
void left_rotate(Node* o){ if (o == NULL) return; Node* k = o -> right; o -> right = k -> left; k -> left = o; }
void right_rotate(Node* k){ if (k == NULL) return; Node* o = k -> left; k -> left = o -> right; o -> right = k; }
void _delete(Node* o){ if (o == NULL) return; int rightsize = 0,leftsize = 0; while (o -> size > 1){ if (o -> right != NULL) rightsize = o -> right -> size; if (o -> left != NULL) rightsize = o -> left -> size; if (rightsize > leftsize) right_rotate(o); else left_rotate(o); } o = NULL; }