Added to Favorites

Popular Searches

In computer science, a binary search tree (BST) is a binary tree data structure which has the following properties:

- each node (item in the tree) has a value;
- a total order (linear order) is defined on these values;
- the left subtree of a node contains only values less than the node's value;
- the right subtree of a node contains only values greater than or equal to the node's value.

The major advantage of binary search trees over other data structures is that the related sorting algorithms and search algorithms such as in-order traversal can be very efficient.

Binary search trees can choose to allow or disallow duplicate values, depending on the implementation.

Binary search trees are a fundamental data structure used to construct more abstract data structures such as sets, multisets, and associative arrays.

We begin by examining the root node. If the tree is null, the value we are searching for does not exist in the tree. Otherwise, if the value equals the root, the search is successful. If the value is less than the root, search the left subtree. Similarly, if it is greater than the root, search the right subtree. This process is repeated until the value is found or the indicated subtree is null. If the searched value is not found before a null subtree is reached, then the item must not be present in the tree.

Here is the search algorithm in the Python programming language:

def search_binary_tree(node, key):

if node is None:

return None # key not found

if key < node.key:

return search_binary_tree(node.left, key)

elif key > node.key:

return search_binary_tree(node.right, key)

else: # key is equal to node key

return node.value # found key

This operation requires O(log n) time in the average case, but needs O(n) time in the worst-case, when the unbalanced tree resembles a linked list (degenerate tree).

Here's how a typical binary search tree insertion might be performed in C++:

/* Inserts the node pointed to by "newNode" into the subtree rooted at "treeNode" */

void InsertNode(Node *&treeNode, Node *newNode)

{

if (treeNode == NULL)

treeNode = newNode;

else if (newNode->key < treeNode->key)

InsertNode(treeNode->left, newNode);

else

InsertNode(treeNode->right, newNode);

}

The above "destructive" procedural variant modifies the tree in place. It uses only constant space, but the previous version of the tree is lost. Alternatively, as in the following Python example, we can reconstruct all ancestors of the inserted node; any reference to the original tree root remains valid, making the tree a persistent data structure:

def binary_tree_insert(node, key, value):

if node is None:

return TreeNode(None, key, value, None)

if key == node.key:

return TreeNode(node.left, key, value, node.right)

if key < node.key:

return TreeNode(binary_tree_insert(node.left, key, value), node.key, node.value, node.right)

else:

return TreeNode(node.left, node.key, node.value, binary_tree_insert(node.right, key, value))

The part that is rebuilt uses Θ(log n) space in the average case and Ω(n) in the worst case (see big-O notation).

In either version, this operation requires time proportional to the height of the tree in the worst case, which is O(log n) time in the average case over all trees, but Ω(n) time in the worst case.

Another way to explain insertion is that in order to insert a new node in the tree, its value is first compared with the value of the root. If its value is less than the root's, it is then compared with the value of the root's left child. If its value is greater, it is compared with the root's right child. This process continues, until the new node is compared with a leaf node, and then it is added as this node's right or left child, depending on its value.

There are other ways of inserting nodes into a binary tree, but this is the only way of inserting nodes at the leaves and at the same time preserving the BST structure.

There are several cases to be considered:

- Deleting a leaf: Deleting a node with no children is easy, as we can simply remove it from the tree.
- Deleting a node with one child: Delete it and replace it with its child.
- Deleting a node with two children: Suppose the node to be deleted is called N. We replace the value of N with either its in-order successor (the left-most child of the right subtree) or the in-order predecessor (the right-most child of the left subtree).

Once we find either the in-order successor or predecessor, swap it with N, and then delete it. Since both the successor and the predecessor must have fewer than two children, either one can be deleted using the previous two cases. A good implementation avoids consistently using one of these nodes, however, because this can unbalance the tree.

Here is C++ sample code for a destructive version of deletion. (We assume the node to be deleted has already been located using `search`

.)

void DeleteNode(Node * & node) {

if (node->left == NULL) {

Node *temp = node;

node = node->right;

delete temp;} else if (node->right == NULL) {

Node *temp = node;

node = node->left;

delete temp;} else {

// In-order predecessor (rightmost child of left subtree)

// Node has two children - get max of left subtree

Node *temp = node->left; // get left node of the original node

// find the rightmost child of the subtree of the left node

while (temp->right != NULL) {

temp = temp->right;}

// copy the value from the in-order predecessor to the original node

node->value = temp->value;

// then delete the predecessor

DeleteNode(temp);} }

Although this operation does not always traverse the tree down to a leaf, this is always a possibility; thus in the worst case it requires time proportional to the height of the tree. It does not require more even when the node has two children, since it still follows a single path and does not visit any node twice.

Here is the code in Python:

succ = None

if self.rightChild:

succ = self.rightChild.findMin()

else:

if self.parent.leftChild == self:

succ = self.parent

else:

self.parent.rightChild = None

succ = self.parent.findSuccessor()

self.parent.rightChild = self

return succ

def findMin(self):

n = self

while n.leftChild:

n = n.leftChild

print 'found min, key = ', n.key

return n

def spliceOut(self):

if (not self.leftChild and not self.rightChild):

if self == self.parent.leftChild:

self.parent.leftChild = None

else:

self.parent.rightChild = None

elif (self.leftChild or self.rightChild):

if self.leftChild:

if self == self.parent.leftChild:

self.parent.leftChild = self.leftChild

else:

self.parent.rightChild = self.leftChild

else:

if self == self.parent.leftChild:

self.parent.leftChild = self.rightChild

else:

self.parent.rightChild = self.rightChild

def binary_tree_delete(self, key):

if self.key == key:

if not (self.leftChild or self.rightChild):

if self == self.parent.leftChild:

self.parent.leftChild = None

else:

self.parent.rightChild = None

elif (self.leftChild or self.rightChild) and (not (self.leftChild and self.rightChild)):

if self.leftChild:

if self == self.parent.leftChild:

self.parent.leftChild = self.leftChild

else:

self.parent.rightChild = self.leftChild

else:

if self == self.parent.leftChild:

self.parent.leftChild = self.rightChild

else:

self.parent.rightChild = self.rightchild

else:

succ = self.findSuccessor()

succ.spliceOut()

if self == self.parent.leftChild:

self.parent.leftChild = succ

else:

self.parent.rightChild = succ

succ.leftChild = self.leftChild

succ.rightChild = self.rightChild

else:

if key < self.key:

if self.leftChild:

self.leftChild.delete_key(key)

else:

print "trying to remove a non-existent node"

else:

if self.rightChild:

self.rightChild.delete_key(key)

else:

print "trying to remove a non-existent node"

Wikipedia, the free encyclopedia © 2001-2006 Wikipedia contributors (Disclaimer)

This article is licensed under the GNU Free Documentation License.

Last updated on Sunday September 21, 2008 at 18:59:58 PDT (GMT -0700)

View this article at Wikipedia.org - Edit this article at Wikipedia.org - Donate to the Wikimedia Foundation

This article is licensed under the GNU Free Documentation License.

Last updated on Sunday September 21, 2008 at 18:59:58 PDT (GMT -0700)

View this article at Wikipedia.org - Edit this article at Wikipedia.org - Donate to the Wikimedia Foundation

Copyright © 2015 Dictionary.com, LLC. All rights reserved.