Inorder successor of a node in binary tree
Given a binary tree which include node elements. Our goal is to find inorder successor of particular node. Which is exist in binary tree.
What is inorder successor
A next node which is part of inorder sequence is called inorder successor of previous node. Note that the last node of inorder sequence has no successor so it indicate NULL (None). For Example.
Binary Tree
-------------------------
1
/ \
2 5
/ \
7 3
------------------------
Inorder [7,2,3,1,5]
// input value indicates node which contains value
Input 7
Output 2 [Next node inorder sequence]
Input 5
Output NULL [No successor in last node]
Input 3
Output 1
We solve this problem using iterative and recursive manner. We given below solution is based on recursive approach.
/*
Java program for
Inorder successor of a node in binary tree
*/
// Binary Tree node
class TreeNode
{
public int data;
public TreeNode left;
public TreeNode right;
public TreeNode(int data)
{
// Set node value
this.data = data;
this.left = null;
this.right = null;
}
}
public class BinaryTree
{
public TreeNode root;
public BinaryTree()
{
// Set initial value
this.root = null;
}
// Display tree element inorder form
public void inorder(TreeNode node)
{
if (node != null)
{
inorder(node.left);
// Print node value
System.out.print(" " + node.data);
inorder(node.right);
}
}
public void findSuccessor(TreeNode node,
TreeNode lp, TreeNode rp, TreeNode n)
{
if (node != null && n != null)
{
// Recursively visiting left and right subtree
findSuccessor(node.left, lp, node, n);
findSuccessor(node.right, node, rp, n);
// Successor Condition
if (node.left == null && lp != null && lp == n)
{
System.out.print("\n Successor of node " +
n.data + " is : " + node.data);
}
else if (node.right == null && rp != null && node == n)
{
System.out.print("\n Successor of node " +
n.data + " is : " + rp.data);
}
else if (node.right == null && rp == null && node == n)
{
System.out.print("\n Successor of node " +
n.data + " is : None ");
}
}
}
// This method are handles the request
// of finding successor in given node
public void successor(TreeNode node)
{
if(node==null || this.root == null)
{
// Invalid node or empty tree
return;
}
this.findSuccessor(this.root, null, null, node);
}
public static void main(String[] args)
{
BinaryTree tree = new BinaryTree();
/*
Make A Binary Tree
-----------------------
1
/ \
2 3
/ / \
4 5 9
\ \
7 6
/
8
*/
// Add tree node
tree.root = new TreeNode(1);
tree.root.left = new TreeNode(2);
tree.root.right = new TreeNode(3);
tree.root.right.right = new TreeNode(9);
tree.root.right.left = new TreeNode(5);
tree.root.right.left.right = new TreeNode(6);
tree.root.left.left = new TreeNode(4);
tree.root.left.left.right = new TreeNode(7);
tree.root.right.left.right.left = new TreeNode(8);
// Display tree element
tree.inorder(tree.root);
// Get tree node
TreeNode node = tree.root.right.left;
tree.successor(node);
// Get new tree node
node = tree.root.left.left.right;
tree.successor(node);
// Get new tree node
node = tree.root.right.right;
tree.successor(node);
// Get new tree node
node = tree.root.right.left.right;
tree.successor(node);
// Get new tree node
node = tree.root.right.left.right.left;
tree.successor(node);
}
}
Output
4 7 2 1 5 8 6 3 9
Successor of node 5 is : 8
Successor of node 7 is : 2
Successor of node 9 is : None
Successor of node 6 is : 3
Successor of node 8 is : 6
// C Program
// Inorder successor of a node in binary tree
#include <stdio.h>
#include <stdlib.h>
// Tree Node
struct TreeNode
{
int data;
struct TreeNode * left;
struct TreeNode * right;
};
// Binary Tree
struct BinaryTree
{
struct TreeNode * root;
};
// Create new tree
struct BinaryTree * newTree()
{
// Create dynamic node
struct BinaryTree * tree =
(struct BinaryTree * ) malloc(sizeof(struct BinaryTree));
if (tree != NULL)
{
tree->root = NULL;
}
else
{
printf("Memory Overflow to Create tree Tree\n");
}
// return new tree
return tree;
}
// This is creates and returns the new binary tree node
struct TreeNode * newNode(int data)
{
// Create dynamic node
struct TreeNode * node = (struct TreeNode * ) malloc(sizeof(struct TreeNode));
if (node != NULL)
{
//Set data and pointer values
node->data = data;
node->left = NULL;
node->right = NULL;
}
else
{
//This is indicates,
// segmentation fault or memory overflow problem
printf("Memory Overflow\n");
exit(0);
}
// return
return node;
}
// Display tree element inorder form
void inorder(struct TreeNode * node)
{
if (node != NULL)
{
inorder(node->left);
// Print node value
printf(" %d", node->data);
inorder(node->right);
}
}
void findSuccessor(struct TreeNode * node,
struct TreeNode * lp,
struct TreeNode * rp, struct TreeNode * n)
{
if (node != NULL && n != NULL)
{
findSuccessor(node->left, lp, node, n);
findSuccessor(node->right, node, rp, n);
// Successor Condition
if (node->left == NULL && lp != NULL && lp == n)
{
printf("\n Successor of node %d is : %d ", n->data, node->data);
}
else if (node->right == NULL && rp != NULL && node == n)
{
printf("\n Successor of node %d is : %d ", n->data, rp->data);
}
else if (node->right == NULL && rp == NULL && node == n)
{
printf("\n Successor of node %d is : NULL ", n->data);
}
}
}
// This method are handles the request
// of finding successor in given node
void successor(struct TreeNode * root,struct TreeNode *node)
{
if (node == NULL || root == NULL)
{
// Invalid node or empty tree
return;
}
findSuccessor(root, NULL, NULL, node);
}
int main()
{
struct BinaryTree * tree = newTree();
/*Make A Binary Tree
-----------------------
1
/ \
2 3
/ / \
4 5 9
\ \
7 6
/
8
*/
// Add tree node
tree->root = newNode(1);
tree->root->left = newNode(2);
tree->root->right = newNode(3);
tree->root->right->right = newNode(9);
tree->root->right->left = newNode(5);
tree->root->right->left->right = newNode(6);
tree->root->left->left = newNode(4);
tree->root->left->left->right = newNode(7);
tree->root->right->left->right->left = newNode(8);
// Display tree element
inorder(tree->root);
// Test
struct TreeNode * node = tree->root->right->left;
successor(tree->root, node);
node = tree->root->left->left->right;
successor(tree->root, node);
node = tree->root->right->right;
successor(tree->root, node);
node = tree->root->right->left->right;
successor(tree->root, node);
node = tree->root->right->left->right->left;
successor(tree->root, node);
return 0;
}
Output
4 7 2 1 5 8 6 3 9
Successor of node 5 is : 8
Successor of node 7 is : 2
Successor of node 9 is : NULL
Successor of node 6 is : 3
Successor of node 8 is : 6
package main
import "fmt"
/*
Go program for
Inorder successor of a node in binary tree
*/
// Binary Tree node
type TreeNode struct {
data int
left * TreeNode
right * TreeNode
}
func getTreeNode(data int) * TreeNode {
var me *TreeNode = &TreeNode {}
// Set node value
me.data = data
me.left = nil
me.right = nil
return me
}
type BinaryTree struct {
root * TreeNode
}
func getBinaryTree() * BinaryTree {
var me *BinaryTree = &BinaryTree {}
// Set initial value
me.root = nil
return me
}
// Display tree element inorder form
func(this BinaryTree) inorder(node * TreeNode) {
if node != nil {
this.inorder(node.left)
// Print node value
fmt.Print(" ", node.data)
this.inorder(node.right)
}
}
func(this BinaryTree) findSuccessor(node, lp, rp, n *TreeNode) {
if node != nil && n != nil {
// Recursively visiting left and right subtree
this.findSuccessor(node.left, lp, node, n)
this.findSuccessor(node.right, node, rp, n)
// Successor Condition
if node.left == nil && lp != nil && lp == n {
fmt.Print("\n Successor of node ", n.data, " is : ", node.data)
} else if node.right == nil && rp != nil && node == n {
fmt.Print("\n Successor of node ", n.data, " is : ", rp.data)
} else if node.right == nil && rp == nil && node == n {
fmt.Print("\n Successor of node ", n.data, " is : None ")
}
}
}
// This method are handles the request
// of finding successor in given node
func(this BinaryTree) successor(node * TreeNode) {
if node == nil || this.root == nil {
// Invalid node or empty tree
return
}
this.findSuccessor(this.root, nil, nil, node)
}
func main() {
var tree * BinaryTree = getBinaryTree()
/*
Make A Binary Tree
-----------------------
1
/ \
2 3
/ / \
4 5 9
\ \
7 6
/
8
*/
// Add tree node
tree.root = getTreeNode(1)
tree.root.left = getTreeNode(2)
tree.root.right = getTreeNode(3)
tree.root.right.right = getTreeNode(9)
tree.root.right.left = getTreeNode(5)
tree.root.right.left.right = getTreeNode(6)
tree.root.left.left = getTreeNode(4)
tree.root.left.left.right = getTreeNode(7)
tree.root.right.left.right.left = getTreeNode(8)
// Display tree element
tree.inorder(tree.root)
// Get tree node
var node * TreeNode = tree.root.right.left
tree.successor(node)
// Get new tree node
node = tree.root.left.left.right
tree.successor(node)
// Get new tree node
node = tree.root.right.right
tree.successor(node)
// Get new tree node
node = tree.root.right.left.right
tree.successor(node)
// Get new tree node
node = tree.root.right.left.right.left
tree.successor(node)
}
Output
4 7 2 1 5 8 6 3 9
Successor of node 5 is : 8
Successor of node 7 is : 2
Successor of node 9 is : None
Successor of node 6 is : 3
Successor of node 8 is : 6
// Include header file
#include <iostream>
using namespace std;
/*
C++ program for
Inorder successor of a node in binary tree
*/
// Binary Tree node
class TreeNode
{
public: int data;
TreeNode *left;
TreeNode *right;
TreeNode(int data)
{
// Set node value
this->data = data;
this->left = NULL;
this->right = NULL;
}
};
class BinaryTree
{
public: TreeNode *root;
BinaryTree()
{
this->root = NULL;
}
// Display tree element inorder form
void inorder(TreeNode *node)
{
if (node != NULL)
{
this->inorder(node->left);
// Print node value
cout << " " << node->data;
this->inorder(node->right);
}
}
void findSuccessor(TreeNode *node,
TreeNode *lp,
TreeNode *rp,
TreeNode *n)
{
if (node != NULL && n != NULL)
{
// Recursively visiting left and right subtree
this->findSuccessor(node->left, lp, node, n);
this->findSuccessor(node->right, node, rp, n);
// Successor Condition
if (node->left == NULL && lp != NULL && lp == n)
{
cout << "\n Successor of node "
<< n->data << " is : " << node->data;
}
else if (node->right == NULL && rp != NULL && node == n)
{
cout << "\n Successor of node "
<< n->data << " is : " << rp->data;
}
else if (node->right == NULL && rp == NULL && node == n)
{
cout << "\n Successor of node "
<< n->data << " is : None ";
}
}
}
// This method are handles the request
// of finding successor in given node
void successor(TreeNode *node)
{
if (node == NULL || this->root == NULL)
{
// Invalid node or empty tree
return;
}
this->findSuccessor(this->root, NULL, NULL, node);
}
};
int main()
{
BinaryTree *tree = new BinaryTree();
/*
Make A Binary Tree
-----------------------
1
/ \
2 3
/ / \
4 5 9
\ \
7 6
/
8
*/
// Add tree node
tree->root = new TreeNode(1);
tree->root->left = new TreeNode(2);
tree->root->right = new TreeNode(3);
tree->root->right->right = new TreeNode(9);
tree->root->right->left = new TreeNode(5);
tree->root->right->left->right = new TreeNode(6);
tree->root->left->left = new TreeNode(4);
tree->root->left->left->right = new TreeNode(7);
tree->root->right->left->right->left = new TreeNode(8);
// Display tree element
tree->inorder(tree->root);
// Get tree node
TreeNode *node = tree->root->right->left;
tree->successor(node);
// Get new tree node
node = tree->root->left->left->right;
tree->successor(node);
// Get new tree node
node = tree->root->right->right;
tree->successor(node);
// Get new tree node
node = tree->root->right->left->right;
tree->successor(node);
// Get new tree node
node = tree->root->right->left->right->left;
tree->successor(node);
return 0;
}
Output
4 7 2 1 5 8 6 3 9
Successor of node 5 is : 8
Successor of node 7 is : 2
Successor of node 9 is : None
Successor of node 6 is : 3
Successor of node 8 is : 6
// Include namespace system
using System;
/*
Csharp program for
Inorder successor of a node in binary tree
*/
// Binary Tree node
public class TreeNode
{
public int data;
public TreeNode left;
public TreeNode right;
public TreeNode(int data)
{
// Set node value
this.data = data;
this.left = null;
this.right = null;
}
}
public class BinaryTree
{
public TreeNode root;
public BinaryTree()
{
// Set initial value
this.root = null;
}
// Display tree element inorder form
public void inorder(TreeNode node)
{
if (node != null)
{
this.inorder(node.left);
// Print node value
Console.Write(" " + node.data);
this.inorder(node.right);
}
}
public void findSuccessor(TreeNode node,
TreeNode lp,
TreeNode rp,
TreeNode n)
{
if (node != null && n != null)
{
// Recursively visiting left and right subtree
this.findSuccessor(node.left, lp, node, n);
this.findSuccessor(node.right, node, rp, n);
// Successor Condition
if (node.left == null && lp != null && lp == n)
{
Console.Write("\n Successor of node " +
n.data + " is : " + node.data);
}
else if (node.right == null && rp != null && node == n)
{
Console.Write("\n Successor of node " +
n.data + " is : " + rp.data);
}
else if (node.right == null && rp == null && node == n)
{
Console.Write("\n Successor of node " +
n.data + " is : None ");
}
}
}
// This method are handles the request
// of finding successor in given node
public void successor(TreeNode node)
{
if (node == null || this.root == null)
{
// Invalid node or empty tree
return;
}
this.findSuccessor(this.root, null, null, node);
}
public static void Main(String[] args)
{
BinaryTree tree = new BinaryTree();
/*
Make A Binary Tree
-----------------------
1
/ \
2 3
/ / \
4 5 9
\ \
7 6
/
8
*/
// Add tree node
tree.root = new TreeNode(1);
tree.root.left = new TreeNode(2);
tree.root.right = new TreeNode(3);
tree.root.right.right = new TreeNode(9);
tree.root.right.left = new TreeNode(5);
tree.root.right.left.right = new TreeNode(6);
tree.root.left.left = new TreeNode(4);
tree.root.left.left.right = new TreeNode(7);
tree.root.right.left.right.left = new TreeNode(8);
// Display tree element
tree.inorder(tree.root);
// Get tree node
TreeNode node = tree.root.right.left;
tree.successor(node);
// Get new tree node
node = tree.root.left.left.right;
tree.successor(node);
// Get new tree node
node = tree.root.right.right;
tree.successor(node);
// Get new tree node
node = tree.root.right.left.right;
tree.successor(node);
// Get new tree node
node = tree.root.right.left.right.left;
tree.successor(node);
}
}
Output
4 7 2 1 5 8 6 3 9
Successor of node 5 is : 8
Successor of node 7 is : 2
Successor of node 9 is : None
Successor of node 6 is : 3
Successor of node 8 is : 6
<?php
/*
Php program for
Inorder successor of a node in binary tree
*/
// Binary Tree node
class TreeNode
{
public $data;
public $left;
public $right;
public function __construct($data)
{
// Set node value
$this->data = $data;
$this->left = NULL;
$this->right = NULL;
}
}
class BinaryTree
{
public $root;
public function __construct()
{
$this->root = NULL;
}
// Display tree element inorder form
public function inorder($node)
{
if ($node != NULL)
{
$this->inorder($node->left);
// Print node value
print_r(" ".strval($node->data));
$this->inorder($node->right);
}
}
public function findSuccessor($node, $lp, $rp, $n)
{
if ($node != NULL && $n != NULL)
{
// Recursively visiting left and right subtree
$this->findSuccessor($node->left, $lp, $node, $n);
$this->findSuccessor($node->right, $node, $rp, $n);
// Successor Condition
if ($node->left == NULL && $lp != NULL && $lp == $n)
{
print_r("\n Successor of node ".strval($n->data).
" is : ".strval($node->data));
}
else if ($node->right == NULL && $rp != NULL && $node == $n)
{
print_r("\n Successor of node ".strval($n->data).
" is : ".strval($rp->data));
}
else if ($node->right == NULL && $rp == NULL && $node == $n)
{
print_r("\n Successor of node ".strval($n->data).
" is : None ");
}
}
}
// This method are handles the request
// of finding successor in given node
public function successor($node)
{
if ($node == NULL || $this->root == NULL)
{
// Invalid node or empty tree
return;
}
$this->findSuccessor($this->root, NULL, NULL, $node);
}
public static
function main($args)
{
$tree = new BinaryTree();
/*
Make A Binary Tree
-----------------------
1
/ \
2 3
/ / \
4 5 9
\ \
7 6
/
8
*/
// Add tree node
$tree->root = new TreeNode(1);
$tree->root->left = new TreeNode(2);
$tree->root->right = new TreeNode(3);
$tree->root->right->right = new TreeNode(9);
$tree->root->right->left = new TreeNode(5);
$tree->root->right->left->right = new TreeNode(6);
$tree->root->left->left = new TreeNode(4);
$tree->root->left->left->right = new TreeNode(7);
$tree->root->right->left->right->left = new TreeNode(8);
// Display tree element
$tree->inorder($tree->root);
// Get tree node
$node = $tree->root->right->left;
$tree->successor($node);
// Get new tree node
$node = $tree->root->left->left->right;
$tree->successor($node);
// Get new tree node
$node = $tree->root->right->right;
$tree->successor($node);
// Get new tree node
$node = $tree->root->right->left->right;
$tree->successor($node);
// Get new tree node
$node = $tree->root->right->left->right->left;
$tree->successor($node);
}
}
BinaryTree::main(array());
Output
4 7 2 1 5 8 6 3 9
Successor of node 5 is : 8
Successor of node 7 is : 2
Successor of node 9 is : None
Successor of node 6 is : 3
Successor of node 8 is : 6
/*
Node JS program for
Inorder successor of a node in binary tree
*/
// Binary Tree node
class TreeNode
{
constructor(data)
{
// Set node value
this.data = data;
this.left = null;
this.right = null;
}
}
class BinaryTree
{
constructor()
{
this.root = null;
}
// Display tree element inorder form
inorder(node)
{
if (node != null)
{
this.inorder(node.left);
// Print node value
process.stdout.write(" " + node.data);
this.inorder(node.right);
}
}
findSuccessor(node, lp, rp, n)
{
if (node != null && n != null)
{
// Recursively visiting left and right subtree
this.findSuccessor(node.left, lp, node, n);
this.findSuccessor(node.right, node, rp, n);
// Successor Condition
if (node.left == null && lp != null && lp == n)
{
process.stdout.write("\n Successor of node " +
n.data + " is : " + node.data);
}
else if (node.right == null && rp != null && node == n)
{
process.stdout.write("\n Successor of node " +
n.data + " is : " + rp.data);
}
else if (node.right == null && rp == null && node == n)
{
process.stdout.write("\n Successor of node " +
n.data + " is : None ");
}
}
}
// This method are handles the request
// of finding successor in given node
successor(node)
{
if (node == null || this.root == null)
{
// Invalid node or empty tree
return;
}
this.findSuccessor(this.root, null, null, node);
}
}
function main()
{
var tree = new BinaryTree();
/*
Make A Binary Tree
-----------------------
1
/ \
2 3
/ / \
4 5 9
\ \
7 6
/
8
*/
// Add tree node
tree.root = new TreeNode(1);
tree.root.left = new TreeNode(2);
tree.root.right = new TreeNode(3);
tree.root.right.right = new TreeNode(9);
tree.root.right.left = new TreeNode(5);
tree.root.right.left.right = new TreeNode(6);
tree.root.left.left = new TreeNode(4);
tree.root.left.left.right = new TreeNode(7);
tree.root.right.left.right.left = new TreeNode(8);
// Display tree element
tree.inorder(tree.root);
// Get tree node
var node = tree.root.right.left;
tree.successor(node);
// Get new tree node
node = tree.root.left.left.right;
tree.successor(node);
// Get new tree node
node = tree.root.right.right;
tree.successor(node);
// Get new tree node
node = tree.root.right.left.right;
tree.successor(node);
// Get new tree node
node = tree.root.right.left.right.left;
tree.successor(node);
}
main();
Output
4 7 2 1 5 8 6 3 9
Successor of node 5 is : 8
Successor of node 7 is : 2
Successor of node 9 is : None
Successor of node 6 is : 3
Successor of node 8 is : 6
# Python 3 program for
# Inorder successor of a node in binary tree
# Binary Tree node
class TreeNode :
def __init__(self, data) :
# Set node value
self.data = data
self.left = None
self.right = None
class BinaryTree :
def __init__(self) :
self.root = None
# Display tree element inorder form
def inorder(self, node) :
if (node != None) :
self.inorder(node.left)
# Print node value
print(" ", node.data, end = "")
self.inorder(node.right)
def findSuccessor(self, node, lp, rp, n) :
if (node != None and n != None) :
# Recursively visiting left and right subtree
self.findSuccessor(node.left, lp, node, n)
self.findSuccessor(node.right, node, rp, n)
# Successor Condition
if (node.left == None and lp != None and lp == n) :
print("\n Successor of node ",
n.data ," is : ", node.data, end = "",sep="")
elif (node.right == None and rp != None and node == n) :
print("\n Successor of node ",
n.data ," is : ", rp.data, end = "",sep="")
elif (node.right == None and rp == None and node == n) :
print("\n Successor of node ",
n.data ," is : None ", end = "",sep="")
# This method are handles the request
# of finding successor in given node
def successor(self, node) :
if (node == None or self.root == None) :
# Invalid node or empty tree
return
self.findSuccessor(self.root, None, None, node)
def main() :
tree = BinaryTree()
# Make A Binary Tree
# -----------------------
# 1
# / \
# 2 3
# / / \
# 4 5 9
# \ \
# 7 6
# /
# 8
# Add tree node
tree.root = TreeNode(1)
tree.root.left = TreeNode(2)
tree.root.right = TreeNode(3)
tree.root.right.right = TreeNode(9)
tree.root.right.left = TreeNode(5)
tree.root.right.left.right = TreeNode(6)
tree.root.left.left = TreeNode(4)
tree.root.left.left.right = TreeNode(7)
tree.root.right.left.right.left = TreeNode(8)
# Display tree element
tree.inorder(tree.root)
# Get tree node
node = tree.root.right.left
tree.successor(node)
# Get new tree node
node = tree.root.left.left.right
tree.successor(node)
# Get new tree node
node = tree.root.right.right
tree.successor(node)
# Get new tree node
node = tree.root.right.left.right
tree.successor(node)
# Get new tree node
node = tree.root.right.left.right.left
tree.successor(node)
if __name__ == "__main__": main()
Output
4 7 2 1 5 8 6 3 9
Successor of node 5 is : 8
Successor of node 7 is : 2
Successor of node 9 is : None
Successor of node 6 is : 3
Successor of node 8 is : 6
# Ruby program for
# Inorder successor of a node in binary tree
# Binary Tree node
class TreeNode
# Define the accessor and reader of class TreeNode
attr_reader :data, :left, :right
attr_accessor :data, :left, :right
def initialize(data)
# Set node value
self.data = data
self.left = nil
self.right = nil
end
end
class BinaryTree
# Define the accessor and reader of class BinaryTree
attr_reader :root
attr_accessor :root
def initialize()
self.root = nil
end
# Display tree element inorder form
def inorder(node)
if (node != nil)
self.inorder(node.left)
# Print node value
print(" ", node.data)
self.inorder(node.right)
end
end
def findSuccessor(node, lp, rp, n)
if (node != nil && n != nil)
# Recursively visiting left and right subtree
self.findSuccessor(node.left, lp, node, n)
self.findSuccessor(node.right, node, rp, n)
# Successor Condition
if (node.left == nil && lp != nil && lp == n)
print("\n Successor of node ",
n.data ," is : ", node.data)
elsif (node.right == nil && rp != nil && node == n)
print("\n Successor of node ", n.data ," is : ", rp.data)
elsif (node.right == nil && rp == nil && node == n)
print("\n Successor of node ", n.data ," is : None ")
end
end
end
# This method are handles the request
# of finding successor in given node
def successor(node)
if (node == nil || self.root == nil)
# Invalid node or empty tree
return
end
self.findSuccessor(self.root, nil, nil, node)
end
end
def main()
tree = BinaryTree.new()
# Make A Binary Tree
# -----------------------
# 1
# / \
# 2 3
# / / \
# 4 5 9
# \ \
# 7 6
# /
# 8
# Add tree node
tree.root = TreeNode.new(1)
tree.root.left = TreeNode.new(2)
tree.root.right = TreeNode.new(3)
tree.root.right.right = TreeNode.new(9)
tree.root.right.left = TreeNode.new(5)
tree.root.right.left.right = TreeNode.new(6)
tree.root.left.left = TreeNode.new(4)
tree.root.left.left.right = TreeNode.new(7)
tree.root.right.left.right.left = TreeNode.new(8)
# Display tree element
tree.inorder(tree.root)
# Get tree node
node = tree.root.right.left
tree.successor(node)
# Get new tree node
node = tree.root.left.left.right
tree.successor(node)
# Get new tree node
node = tree.root.right.right
tree.successor(node)
# Get new tree node
node = tree.root.right.left.right
tree.successor(node)
# Get new tree node
node = tree.root.right.left.right.left
tree.successor(node)
end
main()
Output
4 7 2 1 5 8 6 3 9
Successor of node 5 is : 8
Successor of node 7 is : 2
Successor of node 9 is : None
Successor of node 6 is : 3
Successor of node 8 is : 6
/*
Scala program for
Inorder successor of a node in binary tree
*/
// Binary Tree node
class TreeNode(var data: Int,
var left: TreeNode,
var right: TreeNode)
{
def this(data: Int)
{
// Set node value
this(data, null, null);
}
}
class BinaryTree(var root: TreeNode)
{
def this()
{
this(null);
}
// Display tree element inorder form
def inorder(node: TreeNode): Unit = {
if (node != null)
{
inorder(node.left);
// Print node value
print(" " + node.data);
inorder(node.right);
}
}
def findSuccessor(node: TreeNode,
lp: TreeNode,
rp: TreeNode,
n: TreeNode): Unit = {
if (node != null && n != null)
{
// Recursively visiting left and right subtree
findSuccessor(node.left, lp, node, n);
findSuccessor(node.right, node, rp, n);
// Successor Condition
if (node.left == null && lp != null && lp == n)
{
print("\n Successor of node " +
n.data + " is : " + node.data);
}
else if (node.right == null && rp != null && node == n)
{
print("\n Successor of node " +
n.data + " is : " + rp.data);
}
else if (node.right == null && rp == null && node == n)
{
print("\n Successor of node " +
n.data + " is : None ");
}
}
}
// This method are handles the request
// of finding successor in given node
def successor(node: TreeNode): Unit = {
if (node == null || this.root == null)
{
// Invalid node or empty tree
return;
}
this.findSuccessor(this.root, null, null, node);
}
}
object Main
{
def main(args: Array[String]): Unit = {
var tree: BinaryTree = new BinaryTree();
/*
Make A Binary Tree
-----------------------
1
/ \
2 3
/ / \
4 5 9
\ \
7 6
/
8
*/
// Add tree node
tree.root = new TreeNode(1);
tree.root.left = new TreeNode(2);
tree.root.right = new TreeNode(3);
tree.root.right.right = new TreeNode(9);
tree.root.right.left = new TreeNode(5);
tree.root.right.left.right = new TreeNode(6);
tree.root.left.left = new TreeNode(4);
tree.root.left.left.right = new TreeNode(7);
tree.root.right.left.right.left = new TreeNode(8);
// Display tree element
tree.inorder(tree.root);
// Get tree node
var node: TreeNode = tree.root.right.left;
tree.successor(node);
// Get new tree node
node = tree.root.left.left.right;
tree.successor(node);
// Get new tree node
node = tree.root.right.right;
tree.successor(node);
// Get new tree node
node = tree.root.right.left.right;
tree.successor(node);
// Get new tree node
node = tree.root.right.left.right.left;
tree.successor(node);
}
}
Output
4 7 2 1 5 8 6 3 9
Successor of node 5 is : 8
Successor of node 7 is : 2
Successor of node 9 is : None
Successor of node 6 is : 3
Successor of node 8 is : 6
/*
Swift 4 program for
Inorder successor of a node in binary tree
*/
// Binary Tree node
class TreeNode
{
var data: Int;
var left: TreeNode? ;
var right: TreeNode? ;
init(_ data: Int)
{
// Set node value
self.data = data;
self.left = nil;
self.right = nil;
}
}
class BinaryTree
{
var root: TreeNode? ;
init()
{
self.root = nil;
}
// Display tree element inorder form
func inorder(_ node: TreeNode? )
{
if (node != nil)
{
self.inorder(node!.left);
// Print node value
print(" ", node!.data, terminator: "");
self.inorder(node!.right);
}
}
func findSuccessor(_ node: TreeNode? ,
_ lp : TreeNode? ,
_ rp : TreeNode? ,
_ n : TreeNode? )
{
if (node != nil && n != nil)
{
// Recursively visiting left and right subtree
self.findSuccessor(node!.left, lp, node, n);
self.findSuccessor(node!.right, node, rp, n);
// Successor Condition
if (node!.left == nil && lp != nil && lp === n)
{
print("\n Successor of node ",
n!.data ," is : ", node!.data, terminator: "");
}
else if (node!.right == nil && rp != nil && node === n)
{
print("\n Successor of node ",
n!.data ," is : ", rp!.data, terminator: "");
}
else if (node!.right == nil && rp == nil && node === n)
{
print("\n Successor of node ",
n!.data ," is : None ", terminator: "");
}
}
}
// This method are handles the request
// of finding successor in given node
func successor(_ node: TreeNode? )
{
if (node == nil || self.root == nil)
{
// Invalid node or empty tree
return;
}
self.findSuccessor(self.root, nil, nil, node);
}
}
func main()
{
let tree: BinaryTree = BinaryTree();
/*
Make A Binary Tree
-----------------------
1
/ \
2 3
/ / \
4 5 9
\ \
7 6
/
8
*/
// Add tree node
tree.root = TreeNode(1);
tree.root!.left = TreeNode(2);
tree.root!.right = TreeNode(3);
tree.root!.right!.right = TreeNode(9);
tree.root!.right!.left = TreeNode(5);
tree.root!.right!.left!.right = TreeNode(6);
tree.root!.left!.left = TreeNode(4);
tree.root!.left!.left!.right = TreeNode(7);
tree.root!.right!.left!.right!.left = TreeNode(8);
// Display tree element
tree.inorder(tree.root);
// Get tree node
var node: TreeNode? = tree.root!.right!.left;
tree.successor(node);
// Get new tree node
node = tree.root!.left!.left!.right;
tree.successor(node);
// Get new tree node
node = tree.root!.right!.right;
tree.successor(node);
// Get new tree node
node = tree.root!.right!.left!.right;
tree.successor(node);
// Get new tree node
node = tree.root!.right!.left!.right!.left;
tree.successor(node);
}
main();
Output
4 7 2 1 5 8 6 3 9
Successor of node 5 is : 8
Successor of node 7 is : 2
Successor of node 9 is : None
Successor of node 6 is : 3
Successor of node 8 is : 6
/*
Kotlin program for
Inorder successor of a node in binary tree
*/
// Binary Tree node
class TreeNode
{
var data: Int;
var left: TreeNode ? ;
var right: TreeNode ? ;
constructor(data: Int)
{
// Set node value
this.data = data;
this.left = null;
this.right = null;
}
}
class BinaryTree
{
var root: TreeNode ? ;
constructor()
{
this.root = null;
}
// Display tree element inorder form
fun inorder(node: TreeNode ? ): Unit
{
if (node != null)
{
this.inorder(node.left);
// Print node value
print(" " + node.data);
this.inorder(node.right);
}
}
fun findSuccessor(node: TreeNode ? , lp : TreeNode ? ,
rp : TreeNode ? , n : TreeNode ? ): Unit
{
if (node != null && n != null)
{
// Recursively visiting left and right subtree
this.findSuccessor(node.left, lp, node, n);
this.findSuccessor(node.right, node, rp, n);
// Successor Condition
if (node.left == null && lp != null && lp == n)
{
print("\n Successor of node " +
n.data + " is : " + node.data);
}
else if (node.right == null &&
rp != null && node == n)
{
print("\n Successor of node " +
n.data + " is : " + rp.data);
}
else if (node.right == null &&
rp == null && node == n)
{
print("\n Successor of node " + n.data + " is : None ");
}
}
}
// This method are handles the request
// of finding successor in given node
fun successor(node: TreeNode ? ): Unit
{
if (node == null || this.root == null)
{
// Invalid node or empty tree
return;
}
this.findSuccessor(this.root, null, null, node);
}
}
fun main(args: Array < String > ): Unit
{
val tree: BinaryTree = BinaryTree();
/*
Make A Binary Tree
-----------------------
1
/ \
2 3
/ / \
4 5 9
\ \
7 6
/
8
*/
// Add tree node
tree.root = TreeNode(1);
tree.root?.left = TreeNode(2);
tree.root?.right = TreeNode(3);
tree.root?.right?.right = TreeNode(9);
tree.root?.right?.left = TreeNode(5);
tree.root?.right?.left?.right = TreeNode(6);
tree.root?.left?.left = TreeNode(4);
tree.root?.left?.left?.right = TreeNode(7);
tree.root?.right?.left?.right?.left = TreeNode(8);
// Display tree element
tree.inorder(tree.root);
// Get tree node
var node: TreeNode ? = tree.root?.right?.left;
tree.successor(node);
// Get new tree node
node = tree.root?.left?.left?.right;
tree.successor(node);
// Get new tree node
node = tree.root?.right?.right;
tree.successor(node);
// Get new tree node
node = tree.root?.right?.left?.right;
tree.successor(node);
// Get new tree node
node = tree.root?.right?.left?.right?.left;
tree.successor(node);
}
Output
4 7 2 1 5 8 6 3 9
Successor of node 5 is : 8
Successor of node 7 is : 2
Successor of node 9 is : None
Successor of node 6 is : 3
Successor of node 8 is : 6
Time complexity of above program is O(n). Think about how to solve this problem in iterative manner. And submit your solution in comment box.
Please share your knowledge to improve code and content standard. Also submit your doubts, and test case. We improve by your feedback. We will try to resolve your query as soon as possible.
New Comment