, negBST posBST .
, BST: s /, BST, commonBST, - . , BST, , :
(: -2 2 5 8 -4 -5 -3 -6) BST commonBST ; KEY = abs(number), KEY, KEY.sign. KEY :
- nil ( )
- (
KEY, KEY.keySign=-1 -) - (
KEY, KEY.keySign=+1 +) - (
KEY, , KEY.keySign=0)
( , ), negBST posBST BST, .
negBST posBST , commonBST - +, - .
, commonBST ( ):
For key C:
C*: C contains both +C and -C (keySign = 0)
C : C contains only one of +C and -C (get sign from keySign)
Example binary tree for numbers [-2, 2, 5, 8, -4, -5, -3, -6]:
2*
\
5*
/ \
4 8
/ /
3 6
public class AVLTree {
var key: Int?
var keySign: Int?
var left: AVLTree?
var right: AVLTree?
init() { }
func addNode(key: Int) {
if (self.key == nil) {
self.key = abs(key)
self.keySign = abs(key)/key
return
}
if (abs(key) == self.key) {
self.keySign = 0
}
else if (abs(key) < self.key) {
if (self.left != nil) {
left!.addNode(key)
}
else {
let leftChild : AVLTree = AVLTree()
leftChild.key = abs(key)
leftChild.keySign = abs(key)/key
self.left = leftChild
}
}
else if (abs(key) > self.key) {
if (self.right != nil) {
right!.addNode(key)
}
else {
let rightChild : AVLTree = AVLTree()
rightChild.key = abs(key)
rightChild.keySign = abs(key)/key
self.right = rightChild
}
}
}
}
let numberList : Array<Int> = [-2, 2, 5, 8, -4, -5, -3, -6]
var root = AVLTree()
for number in numberList {
root.addNode(number)
}
, .
CommonBST BST, keySign .
keySign=1, print(key).keySign=-1, print(-key).keySign=0, print(-key) print(key) ( ).
, BST, O (log n) .