Threaded Binary Tree - GeeksforGeeks

12 Apr, 2022
Inorder traversal of a Binary tree can either be done using recursion or with the use of a auxiliary stack. The idea of threaded binary trees is to make inorder traversal faster and do it without stack and without recursion. A binary tree is made threaded by making all right child pointers that would normally be NULL point to the inorder successor of the node (if it exists).There are two types of threaded binary trees. Single Threaded: Where a NULL right pointers is made to point to the inorder successor (if successor exists)Double Threaded: Where both left and right NULL pointers are made to point to inorder predecessor and inorder successor respectively. The predecessor threads are useful for reverse inorder traversal and postorder traversal.The threads are also useful for fast accessing ancestors of a node.Following diagram shows an example Single Threaded Binary Tree. The dotted lines represent threads. 
C representation of a Threaded Node Following is C representation of a single-threaded node.
C
struct Node{    int data;    struct Node *left, *right;    bool rightThread; }
Java representation of a Threaded Node
Following is Java representation of a single-threaded node.
Java
Python3
C#
Javascript
static class Node{    int data;    Node left, right;    boolean rightThread; } // This code contributed by aashish1995
class Node:    def __init__(self, data,rightThread):        self.data = data;        self.left = None;        self.right = None;        self.rightThread = rightThread; # This code is contributed by umadevi9616
public class Node{   public int data;   public Node left, right;   public bool rightThread; } // This code is contributed by aashish1995
<script> class Node {        constructor(val) {            this.data = val;            this.left = null;            this.right = null;            this.rightThread = false;        }    } // This code contributed by aashish1995</script>
Since right pointer is used for two purposes, the boolean variable rightThread is used to indicate whether right pointer points to right child or inorder successor. Similarly, we can add leftThread for a double threaded binary tree.Inorder Traversal using Threads Following is code for inorder traversal in a threaded binary tree.
C
Java
Python3
C#
Javascript
// Utility function to find leftmost node in a tree rooted// with nstruct Node* leftMost(struct Node* n){    if (n == NULL)        return NULL;     while (n->left != NULL)        n = n->left;     return n;} // C code to do inorder traversal in a threaded binary treevoid inOrder(struct Node* root){    struct Node* cur = leftMost(root);    while (cur != NULL) {        printf("%d ", cur->data);         // If this node is a thread node, then go to        // inorder successor        if (cur->rightThread)            cur = cur->right;        else // Else go to the leftmost child in right             // subtree            cur = leftmost(cur->right);    }}
// Utility function to find leftmost node in a tree rooted// with nNode leftMost(Node n){    if (n == null)        return null;     while (n.left != null)        n = n.left;     return n;} // C code to do inorder traversal in a threaded binary treestatic void inOrder(Node root){    Node cur = leftMost(root);    while (cur != null) {        System.out.printf("%d ", cur.data);         // If this node is a thread node, then go to        // inorder successor        if (cur.rightThread)            cur = cur.right;        else // Else go to the leftmost child in right             // subtree            cur = leftmost(cur.right);    }} // This code contributed by aashish1995
# Utility function to find leftmost Node in a tree rooted# with ndef leftMost(n):     if (n == None):        return None;     while (n.left != None):        n = n.left;     return n;  # C code to do inorder traversal in a threaded binary treedef inOrder(root):     cur = leftMost(root);    while (cur != None):        print(cur.data," ");         # If this Node is a thread Node, then go to        # inorder successor        if (cur.rightThread):            cur = cur.right;        else: # Else go to the leftmost child in right             # subtree            cur = leftmost(cur.right); # This code is contributed by Rajput-Ji
// Utility function to find leftmost node in a tree rooted// with nNode leftMost(Node n){  if (n == null)    return null;   while (n.left != null)    n = n.left;   return n;} // C code to do inorder traversal in a threaded binary treestatic void inOrder(Node root){  Node cur = leftMost(root);  while (cur != null)  {    Console.Write("{0} ", cur.data);     // If this node is a thread node, then go to    // inorder successor    if (cur.rightThread)      cur = cur.right;    else // Else go to the leftmost child in right      // subtree      cur = leftmost(cur.right);  }} // This code is contributed by gauravrajput1
<script> // Utility function to find leftmost node in a tree rooted// with nfunction leftMost(n){    if (n == null)        return null;      while (n.left != null)        n = n.left;      return n;} // JavaScript code to do inorder traversal in// a threaded binary treefunction inOrder(root){    let cur = leftMost(root);    while (cur != null) {        document.write(cur.data+" ");          // If this node is a thread node, then go to        // inorder successor        if (cur.rightThread)            cur = cur.right;        else // Else go to the leftmost child in right             // subtree            cur = leftmost(cur.right);        }} // This code is contributed by unknown2108 </script>
Following diagram demonstrates inorder order traversal using threads. 
Advantages of Threaded Binary Tree
In this Tree it enables linear traversal of elements.
It eliminates the use of stack as it perform linear traversal.
Enables to find parent node without explicit use of parent pointer
Threaded tree give forward and backward traversal of nodes by in-order fashion
Nodes contain pointers to in-order predecessor and successor 
We will soon be discussing insertion and deletion in threaded binary trees.Sources: http://en.wikipedia.org/wiki/Threaded_binary_tree www.cs.berkeley.edu/~kamil/teaching/su02/080802.pptPlease write comments if you find anything incorrect, or you want to share more information about the topic discussed above
monil_bansal
gurukiranx
aashish1995
GauravRajput1
unknown2108
umadevi9616
Rajput-Ji
guptavivek0503
threaded-binary-tree
Tree
Tree
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Binary Tree | Set 3 (Types of Binary Tree)
Inorder Tree Traversal without Recursion
Binary Tree | Set 2 (Properties)
Decision Tree
A program to check if a binary tree is BST or not
Construct Tree from given Inorder and Preorder traversals
Introduction to Tree Data Structure
Lowest Common Ancestor in a Binary Tree | Set 1
Complexity of different operations in Binary tree, Binary Search Tree and AVL tree