In
computing
Computing is any goal-oriented activity requiring, benefiting from, or creating computer, computing machinery. It includes the study and experimentation of algorithmic processes, and the development of both computer hardware, hardware and softw ...
, a threaded binary tree is a
binary tree
In computer science, a binary tree is a tree data structure in which each node has at most two children, referred to as the ''left child'' and the ''right child''. That is, it is a ''k''-ary tree with . A recursive definition using set theor ...
variant that facilitates
traversal in a particular order.
An entire binary search tree can be easily traversed in order of the main key but given only a
pointer to a
node
In general, a node is a localized swelling (a "knot") or a point of intersection (a vertex).
Node may refer to:
In mathematics
* Vertex (graph theory), a vertex in a mathematical graph
*Vertex (geometry), a point where two or more curves, lines ...
, finding the node which comes next may be slow or impossible. For example, leaf nodes by definition have no descendants, so given only a pointer to a leaf node no other node can be reached. A threaded tree adds extra information in some or all nodes, so that for any given single node the "next" node can be found quickly, allowing tree traversal without recursion and the extra storage (proportional to the tree's depth) that recursion requires.
Threading
"A binary tree is ''threaded'' by making all right child pointers that would normally be null point to the in-order successor of the node (if it exists), and all left child pointers that would normally be null point to the in-order predecessor of the node."
This assumes the traversal order is the same as
in-order traversal of the tree. However, pointers can instead (or in addition) be added to tree nodes, rather than replacing.
Linked lists
In computer science, a linked list is a linear collection of data elements whose order is not given by their physical placement in memory. Instead, each element points to the next. It is a data structure consisting of a collection of nodes whi ...
thus defined are also commonly called "threads", and can be used to enable traversal in any order(s) desired. For example, a tree whose nodes represent information about people might be sorted by name, but have extra threads allowing quick traversal in order of birth date, weight, or any other known characteristic.
Motivation
Trees, including (but not limited to)
binary search tree
In computer science, a binary search tree (BST), also called an ordered or sorted binary tree, is a Rooted tree, rooted binary tree data structure with the key of each internal node being greater than all the keys in the respective node's left ...
s, can be used to store items in a particular order, such as the value of some property stored in each node, often called a
key. One useful operation on such a tree is ''traversal'': visiting all the items in order of the key.
A simple recursive traversal algorithm that visits each node of a
binary search tree
In computer science, a binary search tree (BST), also called an ordered or sorted binary tree, is a Rooted tree, rooted binary tree data structure with the key of each internal node being greater than all the keys in the respective node's left ...
is the following. Assume is a pointer to a node, or . "Visiting" can mean performing any action on the node or its contents.
Algorithm traverse():
* Input: a pointer to a node (or )
* If , return.
* Else:
** traverse(left-child())
** Visit
** traverse(right-child())
One problem with this algorithm is that, because of its recursion, it uses stack space proportional to the height of a tree. If the tree is fairly balanced, this amounts to space for a tree containing elements. In the worst case, when the tree takes the form of a
chain, the height of the tree is so the algorithm takes space. A second problem is that all traversals must begin at the root when nodes have pointers only to their children. It is common to have a pointer to a particular node, but that is not sufficient to get back to the rest of the tree unless extra information is added, such as thread pointers.
In this approach, it may not be possible to tell whether the left and/or right pointers in a given node actually point to children, or are a consequence of threading. If the distinction is necessary, adding a single bit to each node is enough to record it.
In a 1968 textbook,
Donald Knuth
Donald Ervin Knuth ( ; born January 10, 1938) is an American computer scientist and mathematician. He is a professor emeritus at Stanford University. He is the 1974 recipient of the ACM Turing Award, informally considered the Nobel Prize of comp ...
asked whether a non-recursive algorithm for in-order traversal exists, that uses no stack and leaves the tree unmodified. One of the solutions to this problem is tree threading, presented by Joseph M. Morris in 1979.
In the 1969 follow-up edition, Knuth attributed the threaded tree representation to
Perlis
Perlis (Kedah Malay language, Kedah Malay (Perlis dialect): ''Peghelih'') is a Negeri, state of Malaysia in the northwestern coast of Peninsular Malaysia. It is the smallest state in Malaysia by area and population. The state borders the Thai ...
and Thornton (1960).
Relation to parent pointers
Another way to achieve similar goals is to include a pointer in every node, to that node's parent node. Given that, the "next" node can always be reached, "right" pointers are still null whenever there are no right children. To find the "next" node from a node whose right pointer is null, walk up through "parent" pointers until reaching a node whose right pointer is not null, and is not the child you just came up from. That node is the "next" node, and after it come its descendants on the right.
It is also possible to discover the parent of a node from a threaded binary tree, without explicit use of parent pointers or a stack, although it is slower. To see this, consider a node ''k'' with right child ''r''. Then the left pointer of ''r'' must be either a child or a thread back to ''k''. In the case that ''r'' has a left child, that left child must in turn have either a left child of its own or a thread back to ''k'', and so on for all successive left children. So by following the chain of left pointers from ''r'', we will eventually find a thread pointing back to ''k''. The situation is symmetrically similar when ''q'' is the left child of ''p''—we can follow ''qs right children to a thread pointing ahead to ''p''.
In
Python:
def parent(node):
if node is node.tree.root:
return None
x = node
y = node
while True:
if is_thread(y):
p = y.right
if p is None or p.left is not node:
p = x
while not is_thread(p.left):
p = p.left
p = p.left
return p
elif is_thread(x):
p = x.left
if p is None or p.right is not node:
p = y
while not is_thread(p.right):
p = p.right
p = p.right
return p
x = x.left
y = y.right
Types
# Single threaded: each node is threaded towards either the in-order predecessor or successor (left or right).
# Double threaded: each node is threaded towards both the in-order predecessor and successor (left and right).
The array of in-order traversal
Threads are reference to the predecessors and successors of the node according to an inorder traversal.
In-order traversal of the threaded tree is
A,B,C,D,E,F,G,H,I
, the predecessor of
E
is
D
, the successor of
E
is
F
.
Example
Let's make the Threaded Binary tree out of a normal binary tree:
The
in-order traversal for the above tree is — D B A E C. So, the respective Threaded Binary tree will be --
Null links
In an ''m''-way threaded binary tree with ''n'' nodes, there are ''n''×''m'' − (''n''−1) void links.
References
External links
GNU libavl 2.0.2, Section on threaded binary search trees
{{DEFAULTSORT:Threaded Binary Tree
Articles with example Python (programming language) code
Binary trees
Search trees