Skip to main content

BST to a tree with sum of all smaller keys

Here given code implementation process.

/*
    C program for
    BST to a tree with sum of all smaller keys
*/
#include <stdio.h>
#include <stdlib.h>
// Tree Node
struct TreeNode
{
    int data;
    struct TreeNode *left;
    struct TreeNode *right;
};
// Binary Search Tree
struct BinarySearchTree
{
    struct TreeNode *root;
};

// Create new tree
struct BinarySearchTree *newTree()
{
    // Create dynamic node
    struct BinarySearchTree *tree = (struct BinarySearchTree *) 
                                malloc(sizeof(struct BinarySearchTree));
    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 search tree node
struct TreeNode *getNode(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");
    }
    //return new node
    return node;
}
// Recursive function
// Display preorder view of binary search tree
void preorder(struct TreeNode *node)
{
    if (node!=NULL)
    {
        // Print node value
        printf("  %d", node->data);
        preorder(node->left);
        preorder(node->right);
    }
}
// Adding a new node in binary search tree
void addNode(struct BinarySearchTree *tree, int data)
{
    struct TreeNode *node = getNode(data);
    if (node != NULL)
    {
        if (tree->root == NULL)
        {
            tree->root = node;
        }
        else
        {
            struct TreeNode *auxiliary = tree->root;
            // Add new node in binary search tree
            while (auxiliary != NULL)
            {
                if (data > auxiliary->data)
                {
                    if (auxiliary->right == NULL)
                    {
                        // Add new node at right child
                        auxiliary->right = node;
                        return;
                    }
                    auxiliary = auxiliary->right;
                }
                else
                {
                    if (auxiliary->left == NULL)
                    {
                        // Add new node at left child
                        auxiliary->left = node;
                        return;
                    }
                    auxiliary = auxiliary->left;
                }
            }
        }
    }
}
void replace(struct TreeNode *node, int *sum)
{
    if (node!=NULL)
    {
        // Visit left subtree
        replace(node->left,sum);
        // Add node value
        *sum = *sum + node->data;
        // Change node value
        node->data = *sum;
        // Visit right subtree
        replace(node->right,sum);
    }
}
void replaceBySmaller(struct TreeNode *node)
{
    int sum = 0;

    replace(node,&sum);
}
int main()
{
    struct BinarySearchTree *tree = newTree();
    /*
             6                            
           /   \    
          3     7    
         / \     \               
        2   4     12
       /     \    / 
      1       5  9
    -----------------
        Binary Search Tree
    */
    addNode(tree,6);
    addNode(tree,3);
    addNode(tree,4);
    addNode(tree,5);
    addNode(tree,2);
    addNode(tree,1);
    addNode(tree,7);
    addNode(tree,12);
    addNode(tree,9);


    printf("\n Before Tree Element : ");
    preorder(tree->root);
    /*
          (15+6)

             21  
            /   \                          
    (1+2+3)/     \    
          6       28  (21+7)
         / \       \ 
        /   \       \               
  (1+2)3    10(6+4)  49(37+12)
      /       \      / 
     /         \    /
    1          15  37
            (10+5) (28+9)
    -----------------
      Resultant Binary Search Tree
    */
    replaceBySmaller(tree->root);

    printf("\n After Tree Element : ");
    preorder(tree->root);
    return 0;
}

Output

 Before Tree Element :   6  3  2  1  4  5  7  12  9
 After Tree Element :   21  6  3  1  10  15  28  49  37
/*
    Java Program for
    BST to a tree with sum of all smaller keys
*/
class TreeNode
{
    // Data value 
    public int data;
    // Indicates left and right subtree
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int data)
    {
        this.data = data;
        this.left = null;
        this.right = null;
    }
}
public class BinarySearchTree 
{
    public TreeNode root;
    public int sum;
    public BinarySearchTree()
    {
        this.root = null;
        this.sum  = 0;
    }
    // insert a node in BST
    public void addNode(int data)
    {
        // Create new node of tree
        TreeNode node = new TreeNode(data);

        if (this.root == null)
        {
            this.root = node;
        }
        else
        {
            TreeNode auxiliary = this.root;
            // Add new node in binary search tree
            while (auxiliary != null)
            {
                if (data > auxiliary.data)
                {
                    if (auxiliary.right == null)
                    {
                        // Add new node at right child
                        auxiliary.right = node;
                        return;
                    }
                    auxiliary = auxiliary.right;
                }
                else
                {
                    if (auxiliary.left == null)
                    {
                        // Add new node at left child
                        auxiliary.left = node;
                        return;
                    }
                    auxiliary = auxiliary.left;
                }
            }
        }
    }
    // Recursive function
    // Display preorder view of binary search tree
    public void preorder(TreeNode node)
    {
        if (node != null)
        {
            // Print node value
            System.out.print(" " + node.data );
            preorder(node.left);
            preorder(node.right);
        }
    }
    public void replace(TreeNode node)
    {
        if (node != null)
        {
            // Visit left subtree
            replace(node.left);
            // Add node value
            this.sum = this.sum + node.data;
            // Change node value
            node.data = this.sum;
            // Visit right subtree
            replace(node.right);
        }
    }
    public void replaceBySmaller()
    {
        this.sum = 0;

        this.replace(this.root);

    }
    public static void main(String[] args) 
    {
        BinarySearchTree tree = new BinarySearchTree();
        /*
                 6                            
               /   \    
              3     7    
             / \     \               
            2   4     12
           /     \    / 
          1       5  9
        -----------------
            Binary Search Tree
        */
        tree.addNode(6);
        tree.addNode(3);
        tree.addNode(2);
        tree.addNode(1);
        tree.addNode(4);
        tree.addNode(5);
        tree.addNode(7);
        tree.addNode(12);
        tree.addNode(9);

        System.out.print("\n Before Tree Element : ");
        tree.preorder(tree.root);
        /*
              (15+6)

                 21  
                /   \                          
        (1+2+3)/     \    
              6       28  (21+7)
             / \       \ 
            /   \       \               
      (1+2)3    10(6+4)  49(37+12)
          /       \      / 
         /         \    /
        1          15  37
                (10+5) (28+9)
        -----------------
        Resultant Binary Search Tree
        */
        tree.replaceBySmaller();
        System.out.print("\n After Tree Element : ");
        tree.preorder(tree.root);

    }
}

Output

 Before Tree Element :  6 3 2 1 4 5 7 12 9
 After Tree Element :  21 6 3 1 10 15 28 49 37
// Include header file
#include <iostream>

using namespace std;
/*
    C++ Program for
    BST to a tree with sum of all smaller keys
*/
class TreeNode
{
	public:
	// Data value
	int data;
	// Indicates left and right subtree
	TreeNode *left;
	TreeNode *right;
	TreeNode(int data)
	{
		this->data = data;
		this->left = NULL;
		this->right = NULL;
	}
};
class BinarySearchTree
{
	public: 
    TreeNode *root;
	int sum;
	BinarySearchTree()
	{
		this->root = NULL;
		this->sum = 0;
	}
	// insert a node in BST
	void addNode(int data)
	{
		// Create new node of tree
		TreeNode *node = new TreeNode(data);
		if (this->root == NULL)
		{
			this->root = node;
		}
		else
		{
			TreeNode *auxiliary = this->root;
			// Add new node in binary search tree
			while (auxiliary != NULL)
			{
				if (data > auxiliary->data)
				{
					if (auxiliary->right == NULL)
					{
						// Add new node at right child
						auxiliary->right = node;
						return;
					}
					auxiliary = auxiliary->right;
				}
				else
				{
					if (auxiliary->left == NULL)
					{
						// Add new node at left child
						auxiliary->left = node;
						return;
					}
					auxiliary = auxiliary->left;
				}
			}
		}
	}
	// Recursive function
	// Display preorder view of binary search tree
	void preorder(TreeNode *node)
	{
		if (node != NULL)
		{
			// Print node value
			cout << " " << node->data;
			this->preorder(node->left);
			this->preorder(node->right);
		}
	}
	void replace(TreeNode *node)
	{
		if (node != NULL)
		{
			// Visit left subtree
			this->replace(node->left);
			// Add node value
			this->sum = this->sum + node->data;
			// Change node value
			node->data = this->sum;
			// Visit right subtree
			this->replace(node->right);
		}
	}
	void replaceBySmaller()
	{
		this->sum = 0;
		this->replace(this->root);
	}
};
int main()
{
	BinarySearchTree *tree = new BinarySearchTree();
	/*
	         6                            
	       /   \    
	      3     7    
	     / \     \               
	    2   4     12
	   /     \    / 
	  1       5  9
	-----------------
	    Binary Search Tree
	        
	*/
	tree->addNode(6);
	tree->addNode(3);
	tree->addNode(2);
	tree->addNode(1);
	tree->addNode(4);
	tree->addNode(5);
	tree->addNode(7);
	tree->addNode(12);
	tree->addNode(9);
	cout << "\n Before Tree Element : ";
	tree->preorder(tree->root);
	/*
	          (15+6)
	             21  
	            /   \                          
	    (1+2+3)/     \    
	          6       28  (21+7)
	         / \       \ 
	        /   \       \               
	  (1+2)3    10(6+4)  49(37+12)
	      /       \      / 
	     /         \    /
	    1          15  37
	            (10+5) (28+9)
	    -----------------
	    Resultant Binary Search Tree
	        
	*/
	tree->replaceBySmaller();
	cout << "\n After Tree Element : ";
	tree->preorder(tree->root);
	return 0;
}

Output

 Before Tree Element :  6 3 2 1 4 5 7 12 9
 After Tree Element :  21 6 3 1 10 15 28 49 37
// Include namespace system
using System;
/*
    Csharp Program for
    BST to a tree with sum of all smaller keys
*/
public class TreeNode
{
	// Data value
	public int data;
	// Indicates left and right subtree
	public TreeNode left;
	public TreeNode right;
	public TreeNode(int data)
	{
		this.data = data;
		this.left = null;
		this.right = null;
	}
}
public class BinarySearchTree
{
	public TreeNode root;
	public int sum;
	public BinarySearchTree()
	{
		this.root = null;
		this.sum = 0;
	}
	// insert a node in BST
	public void addNode(int data)
	{
		// Create new node of tree
		TreeNode node = new TreeNode(data);
		if (this.root == null)
		{
			this.root = node;
		}
		else
		{
			TreeNode auxiliary = this.root;
			// Add new node in binary search tree
			while (auxiliary != null)
			{
				if (data > auxiliary.data)
				{
					if (auxiliary.right == null)
					{
						// Add new node at right child
						auxiliary.right = node;
						return;
					}
					auxiliary = auxiliary.right;
				}
				else
				{
					if (auxiliary.left == null)
					{
						// Add new node at left child
						auxiliary.left = node;
						return;
					}
					auxiliary = auxiliary.left;
				}
			}
		}
	}
	// Recursive function
	// Display preorder view of binary search tree
	public void preorder(TreeNode node)
	{
		if (node != null)
		{
			// Print node value
			Console.Write(" " + node.data);
			this.preorder(node.left);
			this.preorder(node.right);
		}
	}
	public void replace(TreeNode node)
	{
		if (node != null)
		{
			// Visit left subtree
			this.replace(node.left);
			// Add node value
			this.sum = this.sum + node.data;
			// Change node value
			node.data = this.sum;
			// Visit right subtree
			this.replace(node.right);
		}
	}
	public void replaceBySmaller()
	{
		this.sum = 0;
		this.replace(this.root);
	}
	public static void Main(String[] args)
	{
		BinarySearchTree tree = new BinarySearchTree();
		/*
		         6                            
		       /   \    
		      3     7    
		     / \     \               
		    2   4     12
		   /     \    / 
		  1       5  9
		-----------------
		    Binary Search Tree
		        
		*/
		tree.addNode(6);
		tree.addNode(3);
		tree.addNode(2);
		tree.addNode(1);
		tree.addNode(4);
		tree.addNode(5);
		tree.addNode(7);
		tree.addNode(12);
		tree.addNode(9);
		Console.Write("\n Before Tree Element : ");
		tree.preorder(tree.root);
		/*
		          (15+6)
		             21  
		            /   \                          
		    (1+2+3)/     \    
		          6       28  (21+7)
		         / \       \ 
		        /   \       \               
		  (1+2)3    10(6+4)  49(37+12)
		      /       \      / 
		     /         \    /
		    1          15  37
		            (10+5) (28+9)
		    -----------------
		    Resultant Binary Search Tree
		        
		*/
		tree.replaceBySmaller();
		Console.Write("\n After Tree Element : ");
		tree.preorder(tree.root);
	}
}

Output

 Before Tree Element :  6 3 2 1 4 5 7 12 9
 After Tree Element :  21 6 3 1 10 15 28 49 37
package main
import "fmt"
/*
    Go Program for
    BST to a tree with sum of all smaller keys
*/
type TreeNode struct {
	// Data value
	data int
	// Indicates left and right subtree
	left * TreeNode
	right * TreeNode
}
func getTreeNode(data int) * TreeNode {
	var me *TreeNode = &TreeNode {}
	me.data = data
	me.left = nil
	me.right = nil
	return me
}
type BinarySearchTree struct {
	root * TreeNode
	sum int
}
func getBinarySearchTree() * BinarySearchTree {
	var me *BinarySearchTree = &BinarySearchTree {}
	me.root = nil
	me.sum = 0
	return me
}
// insert a node in BST
func(this *BinarySearchTree) addNode(data int) {
	// Create new node of tree
	var node * TreeNode = getTreeNode(data)
	if this.root == nil {
		this.root = node
	} else {
		var auxiliary * TreeNode = this.root
		// Add new node in binary search tree
		for (auxiliary != nil) {
			if data > auxiliary.data {
				if auxiliary.right == nil {
					// Add new node at right child
					auxiliary.right = node
					return
				}
				auxiliary = auxiliary.right
			} else {
				if auxiliary.left == nil {
					// Add new node at left child
					auxiliary.left = node
					return
				}
				auxiliary = auxiliary.left
			}
		}
	}
}
// Recursive function
// Display preorder view of binary search tree
func(this BinarySearchTree) preorder(node * TreeNode) {
	if node != nil {
		// Print node value
		fmt.Print(" ", node.data)
		this.preorder(node.left)
		this.preorder(node.right)
	}
}
func(this *BinarySearchTree) replace(node * TreeNode) {
	if node != nil {
		// Visit left subtree
		this.replace(node.left)
		// Add node value
		this.sum = this.sum + node.data
		// Change node value
		node.data = this.sum
		// Visit right subtree
		this.replace(node.right)
	}
}
func(this BinarySearchTree) replaceBySmaller() {
	this.sum = 0
	this.replace(this.root)
}
func main() {
	var tree * BinarySearchTree = getBinarySearchTree()
	/*
	         6                            
	       /   \    
	      3     7    
	     / \     \               
	    2   4     12
	   /     \    / 
	  1       5  9
	-----------------
	    Binary Search Tree
	        
	*/
	tree.addNode(6)
	tree.addNode(3)
	tree.addNode(2)
	tree.addNode(1)
	tree.addNode(4)
	tree.addNode(5)
	tree.addNode(7)
	tree.addNode(12)
	tree.addNode(9)
	fmt.Print("\n Before Tree Element : ")
	tree.preorder(tree.root)
	/*
	          (15+6)
	             21  
	            /   \                          
	    (1+2+3)/     \    
	          6       28  (21+7)
	         / \       \ 
	        /   \       \               
	  (1+2)3    10(6+4)  49(37+12)
	      /       \      / 
	     /         \    /
	    1          15  37
	            (10+5) (28+9)
	    -----------------
	    Resultant Binary Search Tree
	        
	*/
	tree.replaceBySmaller()
	fmt.Print("\n After Tree Element : ")
	tree.preorder(tree.root)
}

Output

 Before Tree Element :  6 3 2 1 4 5 7 12 9
 After Tree Element :  21 6 3 1 10 15 28 49 37
<?php
/*
    Php Program for
    BST to a tree with sum of all smaller keys
*/
class TreeNode
{
	// Data value
	public $data;
	// Indicates left and right subtree
	public $left;
	public $right;
	public	function __construct($data)
	{
		$this->data = $data;
		$this->left = NULL;
		$this->right = NULL;
	}
}
class BinarySearchTree
{
	public $root;
	public $sum;
	public	function __construct()
	{
		$this->root = NULL;
		$this->sum = 0;
	}
	// insert a node in BST
	public	function addNode($data)
	{
		// Create new node of tree
		$node = new TreeNode($data);
		if ($this->root == NULL)
		{
			$this->root = $node;
		}
		else
		{
			$auxiliary = $this->root;
			// Add new node in binary search tree
			while ($auxiliary != NULL)
			{
				if ($data > $auxiliary->data)
				{
					if ($auxiliary->right == NULL)
					{
						// Add new node at right child
						$auxiliary->right = $node;
						return;
					}
					$auxiliary = $auxiliary->right;
				}
				else
				{
					if ($auxiliary->left == NULL)
					{
						// Add new node at left child
						$auxiliary->left = $node;
						return;
					}
					$auxiliary = $auxiliary->left;
				}
			}
		}
	}
	// Recursive function
	// Display preorder view of binary search tree
	public	function preorder($node)
	{
		if ($node != NULL)
		{
			// Print node value
			echo(" ".$node->data);
			$this->preorder($node->left);
			$this->preorder($node->right);
		}
	}
	public	function replace($node)
	{
		if ($node != NULL)
		{
			// Visit left subtree
			$this->replace($node->left);
			// Add node value
			$this->sum = $this->sum + $node->data;
			// Change node value
			$node->data = $this->sum;
			// Visit right subtree
			$this->replace($node->right);
		}
	}
	public	function replaceBySmaller()
	{
		$this->sum = 0;
		$this->replace($this->root);
	}
}

function main()
{
	$tree = new BinarySearchTree();
	/*
	         6                            
	       /   \    
	      3     7    
	     / \     \               
	    2   4     12
	   /     \    / 
	  1       5  9
	-----------------
	    Binary Search Tree
	        
	*/
	$tree->addNode(6);
	$tree->addNode(3);
	$tree->addNode(2);
	$tree->addNode(1);
	$tree->addNode(4);
	$tree->addNode(5);
	$tree->addNode(7);
	$tree->addNode(12);
	$tree->addNode(9);
	echo("\n Before Tree Element : ");
	$tree->preorder($tree->root);
	/*
	          (15+6)
	             21  
	            /   \                          
	    (1+2+3)/     \    
	          6       28  (21+7)
	         / \       \ 
	        /   \       \               
	  (1+2)3    10(6+4)  49(37+12)
	      /       \      / 
	     /         \    /
	    1          15  37
	            (10+5) (28+9)
	    -----------------
	    Resultant Binary Search Tree
	        
	*/
	$tree->replaceBySmaller();
	echo("\n After Tree Element : ");
	$tree->preorder($tree->root);
}
main();

Output

 Before Tree Element :  6 3 2 1 4 5 7 12 9
 After Tree Element :  21 6 3 1 10 15 28 49 37
/*
    Node JS Program for
    BST to a tree with sum of all smaller keys
*/
class TreeNode
{
	constructor(data)
	{
		this.data = data;
		this.left = null;
		this.right = null;
	}
}
class BinarySearchTree
{
	constructor()
	{
		this.root = null;
		this.sum = 0;
	}
	// insert a node in BST
	addNode(data)
	{
		// Create new node of tree
		var node = new TreeNode(data);
		if (this.root == null)
		{
			this.root = node;
		}
		else
		{
			var auxiliary = this.root;
			// Add new node in binary search tree
			while (auxiliary != null)
			{
				if (data > auxiliary.data)
				{
					if (auxiliary.right == null)
					{
						// Add new node at right child
						auxiliary.right = node;
						return;
					}
					auxiliary = auxiliary.right;
				}
				else
				{
					if (auxiliary.left == null)
					{
						// Add new node at left child
						auxiliary.left = node;
						return;
					}
					auxiliary = auxiliary.left;
				}
			}
		}
	}
	// Recursive function
	// Display preorder view of binary search tree
	preorder(node)
	{
		if (node != null)
		{
			// Print node value
			process.stdout.write(" " + node.data);
			this.preorder(node.left);
			this.preorder(node.right);
		}
	}
	replace(node)
	{
		if (node != null)
		{
			// Visit left subtree
			this.replace(node.left);
			// Add node value
			this.sum = this.sum + node.data;
			// Change node value
			node.data = this.sum;
			// Visit right subtree
			this.replace(node.right);
		}
	}
	replaceBySmaller()
	{
		this.sum = 0;
		this.replace(this.root);
	}
}

function main()
{
	var tree = new BinarySearchTree();
	/*
	         6                            
	       /   \    
	      3     7    
	     / \     \               
	    2   4     12
	   /     \    / 
	  1       5  9
	-----------------
	    Binary Search Tree
	        
	*/
	tree.addNode(6);
	tree.addNode(3);
	tree.addNode(2);
	tree.addNode(1);
	tree.addNode(4);
	tree.addNode(5);
	tree.addNode(7);
	tree.addNode(12);
	tree.addNode(9);
	process.stdout.write("\n Before Tree Element : ");
	tree.preorder(tree.root);
	/*
	          (15+6)
	             21  
	            /   \                          
	    (1+2+3)/     \    
	          6       28  (21+7)
	         / \       \ 
	        /   \       \               
	  (1+2)3    10(6+4)  49(37+12)
	      /       \      / 
	     /         \    /
	    1          15  37
	            (10+5) (28+9)
	    -----------------
	    Resultant Binary Search Tree
	        
	*/
	tree.replaceBySmaller();
	process.stdout.write("\n After Tree Element : ");
	tree.preorder(tree.root);
}
main();

Output

 Before Tree Element :  6 3 2 1 4 5 7 12 9
 After Tree Element :  21 6 3 1 10 15 28 49 37
#    Python 3 Program for
#    BST to a tree with sum of all smaller keys
class TreeNode :
	#  Data value
	#  Indicates left and right subtree
	def __init__(self, data) :
		self.data = data
		self.left = None
		self.right = None
	

class BinarySearchTree :
	def __init__(self) :
		self.root = None
		self.sum = 0
	
	#  insert a node in BST
	def addNode(self, data) :
		#  Create new node of tree
		node = TreeNode(data)
		if (self.root == None) :
			self.root = node
		else :
			auxiliary = self.root
			#  Add new node in binary search tree
			while (auxiliary != None) :
				if (data > auxiliary.data) :
					if (auxiliary.right == None) :
						#  Add new node at right child
						auxiliary.right = node
						return
					
					auxiliary = auxiliary.right
				else :
					if (auxiliary.left == None) :
						#  Add new node at left child
						auxiliary.left = node
						return
					
					auxiliary = auxiliary.left
				
			
		
	
	#  Recursive function
	#  Display preorder view of binary search tree
	def preorder(self, node) :
		if (node != None) :
			#  Print node value
			print(" ", node.data, end = "")
			self.preorder(node.left)
			self.preorder(node.right)
		
	
	def replace(self, node) :
		if (node != None) :
			#  Visit left subtree
			self.replace(node.left)
			#  Add node value
			self.sum = self.sum + node.data
			#  Change node value
			node.data = self.sum
			#  Visit right subtree
			self.replace(node.right)
		
	
	def replaceBySmaller(self) :
		self.sum = 0
		self.replace(self.root)
	

def main() :
	tree = BinarySearchTree()
	#         6                            
	#       /   \    
	#      3     7    
	#     / \     \               
	#    2   4     12
	#   /     \    / 
	#  1       5  9
	# -----------------
	#    Binary Search Tree
	tree.addNode(6)
	tree.addNode(3)
	tree.addNode(2)
	tree.addNode(1)
	tree.addNode(4)
	tree.addNode(5)
	tree.addNode(7)
	tree.addNode(12)
	tree.addNode(9)
	print("\n Before Tree Element : ", end = "")
	tree.preorder(tree.root)
	#          (15+6)
	#             21  
	#            /   \                          
	#    (1+2+3)/     \    
	#          6       28  (21+7)
	#         / \       \ 
	#        /   \       \               
	#  (1+2)3    10(6+4)  49(37+12)
	#      /       \      / 
	#     /         \    /
	#    1          15  37
	#            (10+5) (28+9)
	#    -----------------
	#    Resultant Binary Search Tree
	tree.replaceBySmaller()
	print("\n After Tree Element : ", end = "")
	tree.preorder(tree.root)

if __name__ == "__main__": main()

Output

 Before Tree Element :   6  3  2  1  4  5  7  12  9
 After Tree Element :   21  6  3  1  10  15  28  49  37
#    Ruby Program for
#    BST to a tree with sum of all smaller keys
class TreeNode 
	# Define the accessor and reader of class TreeNode
	attr_reader :data, :left, :right
	attr_accessor :data, :left, :right
	#  Data value
	#  Indicates left and right subtree
	def initialize(data) 
		self.data = data
		self.left = nil
		self.right = nil
	end

end

class BinarySearchTree 
	# Define the accessor and reader of class BinarySearchTree
	attr_reader :root, :sum
	attr_accessor :root, :sum
	def initialize() 
		self.root = nil
		self.sum = 0
	end

	#  insert a node in BST
	def addNode(data) 
		#  Create new node of tree
		node = TreeNode.new(data)
		if (self.root == nil) 
			self.root = node
		else
 
			auxiliary = self.root
			#  Add new node in binary search tree
			while (auxiliary != nil) 
				if (data > auxiliary.data) 
					if (auxiliary.right == nil) 
						#  Add new node at right child
						auxiliary.right = node
						return
					end

					auxiliary = auxiliary.right
				else
 
					if (auxiliary.left == nil) 
						#  Add new node at left child
						auxiliary.left = node
						return
					end

					auxiliary = auxiliary.left
				end

			end

		end

	end

	#  Recursive function
	#  Display preorder view of binary search tree
	def preorder(node) 
		if (node != nil) 
			#  Print node value
			print(" ", node.data)
			self.preorder(node.left)
			self.preorder(node.right)
		end

	end

	def replace(node) 
		if (node != nil) 
			#  Visit left subtree
			self.replace(node.left)
			#  Add node value
			self.sum = self.sum + node.data
			#  Change node value
			node.data = self.sum
			#  Visit right subtree
			self.replace(node.right)
		end

	end

	def replaceBySmaller() 
		self.sum = 0
		self.replace(self.root)
	end

end

def main() 
	tree = BinarySearchTree.new()
	#         6                            
	#       /   \    
	#      3     7    
	#     / \     \               
	#    2   4     12
	#   /     \    / 
	#  1       5  9
	# -----------------
	#    Binary Search Tree
	tree.addNode(6)
	tree.addNode(3)
	tree.addNode(2)
	tree.addNode(1)
	tree.addNode(4)
	tree.addNode(5)
	tree.addNode(7)
	tree.addNode(12)
	tree.addNode(9)
	print("\n Before Tree Element : ")
	tree.preorder(tree.root)
	#          (15+6)
	#             21  
	#            /   \                          
	#    (1+2+3)/     \    
	#          6       28  (21+7)
	#         / \       \ 
	#        /   \       \               
	#  (1+2)3    10(6+4)  49(37+12)
	#      /       \      / 
	#     /         \    /
	#    1          15  37
	#            (10+5) (28+9)
	#    -----------------
	#    Resultant Binary Search Tree
	tree.replaceBySmaller()
	print("\n After Tree Element : ")
	tree.preorder(tree.root)
end

main()

Output

 Before Tree Element :  6 3 2 1 4 5 7 12 9
 After Tree Element :  21 6 3 1 10 15 28 49 37
/*
    Scala Program for
    BST to a tree with sum of all smaller keys
*/
class TreeNode(
	// Data value
	var data: Int,
		// Indicates left and right subtree
		var left: TreeNode,
			var right: TreeNode)
{
	def this(data: Int)
	{
		this(data,null,null);
	}
}
class BinarySearchTree(var root: TreeNode,
	var sum: Int)
{
	def this()
	{
		this(null,0);
	}
	// insert a node in BST
	def addNode(data: Int): Unit = {
		// Create new node of tree
		var node: TreeNode = new TreeNode(data);
		if (this.root == null)
		{
			this.root = node;
		}
		else
		{
			var auxiliary: TreeNode = this.root;
			// Add new node in binary search tree
			while (auxiliary != null)
			{
				if (data > auxiliary.data)
				{
					if (auxiliary.right == null)
					{
						// Add new node at right child
						auxiliary.right = node;
						return;
					}
					auxiliary = auxiliary.right;
				}
				else
				{
					if (auxiliary.left == null)
					{
						// Add new node at left child
						auxiliary.left = node;
						return;
					}
					auxiliary = auxiliary.left;
				}
			}
		}
	}
	// Recursive function
	// Display preorder view of binary search tree
	def preorder(node: TreeNode): Unit = {
		if (node != null)
		{
			// Print node value
			print(" " + node.data);
			preorder(node.left);
			preorder(node.right);
		}
	}
	def replace(node: TreeNode): Unit = {
		if (node != null)
		{
			// Visit left subtree
			replace(node.left);
			// Add node value
			this.sum = this.sum + node.data;
			// Change node value
			node.data = this.sum;
			// Visit right subtree
			replace(node.right);
		}
	}
	def replaceBySmaller(): Unit = {
		this.sum = 0;
		this.replace(this.root);
	}
}
object Main
{
	def main(args: Array[String]): Unit = {
		var tree: BinarySearchTree = new BinarySearchTree();
		/*
		         6                            
		       /   \    
		      3     7    
		     / \     \               
		    2   4     12
		   /     \    / 
		  1       5  9
		-----------------
		    Binary Search Tree
		        
		*/
		tree.addNode(6);
		tree.addNode(3);
		tree.addNode(2);
		tree.addNode(1);
		tree.addNode(4);
		tree.addNode(5);
		tree.addNode(7);
		tree.addNode(12);
		tree.addNode(9);
		print("\n Before Tree Element : ");
		tree.preorder(tree.root);
		/*
		          (15+6)
		             21  
		            /   \                          
		    (1+2+3)/     \    
		          6       28  (21+7)
		         / \       \ 
		        /   \       \               
		  (1+2)3    10(6+4)  49(37+12)
		      /       \      / 
		     /         \    /
		    1          15  37
		            (10+5) (28+9)
		    -----------------
		    Resultant Binary Search Tree
		        
		*/
		tree.replaceBySmaller();
		print("\n After Tree Element : ");
		tree.preorder(tree.root);
	}
}

Output

 Before Tree Element :  6 3 2 1 4 5 7 12 9
 After Tree Element :  21 6 3 1 10 15 28 49 37
/*
    Swift 4 Program for
    BST to a tree with sum of all smaller keys
*/
class TreeNode
{
	// Data value
	var data: Int;
	// Indicates left and right subtree
	var left: TreeNode? ;
	var right: TreeNode? ;
	init(_ data: Int)
	{
		self.data = data;
		self.left = nil;
		self.right = nil;
	}
}
class BinarySearchTree
{
	var root: TreeNode? ;
	var sum: Int;
	init()
	{
		self.root = nil;
		self.sum = 0;
	}
	// insert a node in BST
	func addNode(_ data: Int)
	{
		// Create new node of tree
		let node: TreeNode = TreeNode(data);
		if (self.root == nil)
		{
			self.root = node;
		}
		else
		{
			var auxiliary: TreeNode? = self.root;
			// Add new node in binary search tree
			while (auxiliary  != nil)
			{
				if (data > auxiliary!.data)
				{
					if (auxiliary!.right == nil)
					{
						// Add new node at right child
						auxiliary!.right = node;
						return;
					}
					auxiliary = auxiliary!.right;
				}
				else
				{
					if (auxiliary!.left == nil)
					{
						// Add new node at left child
						auxiliary!.left = node;
						return;
					}
					auxiliary = auxiliary!.left;
				}
			}
		}
	}
	// Recursive function
	// Display preorder view of binary search tree
	func preorder(_ node: TreeNode? )
	{
		if (node  != nil)
		{
			// Print node value
			print(" ", node!.data, terminator: "");
			self.preorder(node!.left);
			self.preorder(node!.right);
		}
	}
	func replace(_ node: TreeNode? )
	{
		if (node  != nil)
		{
			// Visit left subtree
			self.replace(node!.left);
			// Add node value
			self.sum = self.sum + node!.data;
			// Change node value
			node!.data = self.sum;
			// Visit right subtree
			self.replace(node!.right);
		}
	}
	func replaceBySmaller()
	{
		self.sum = 0;
		self.replace(self.root);
	}
}
func main()
{
	let tree: BinarySearchTree = BinarySearchTree();
	/*
	         6                            
	       /   \    
	      3     7    
	     / \     \               
	    2   4     12
	   /     \    / 
	  1       5  9
	-----------------
	    Binary Search Tree
	        
	*/
	tree.addNode(6);
	tree.addNode(3);
	tree.addNode(2);
	tree.addNode(1);
	tree.addNode(4);
	tree.addNode(5);
	tree.addNode(7);
	tree.addNode(12);
	tree.addNode(9);
	print("\n Before Tree Element : ", terminator: "");
	tree.preorder(tree.root);
	/*
	          (15+6)
	             21  
	            /   \                          
	    (1+2+3)/     \    
	          6       28  (21+7)
	         / \       \ 
	        /   \       \               
	  (1+2)3    10(6+4)  49(37+12)
	      /       \      / 
	     /         \    /
	    1          15  37
	            (10+5) (28+9)
	    -----------------
	    Resultant Binary Search Tree
	        
	*/
	tree.replaceBySmaller();
	print("\n After Tree Element : ", terminator: "");
	tree.preorder(tree.root);
}
main();

Output

 Before Tree Element :   6  3  2  1  4  5  7  12  9
 After Tree Element :   21  6  3  1  10  15  28  49  37
/*
    Kotlin Program for
    BST to a tree with sum of all smaller keys
*/
class TreeNode
{
	// Data value
	var data: Int;
	// Indicates left and right subtree
	var left: TreeNode ? ;
	var right: TreeNode ? ;
	constructor(data: Int)
	{
		this.data = data;
		this.left = null;
		this.right = null;
	}
}
class BinarySearchTree
{
	var root: TreeNode ? ;
	var sum: Int;
	constructor()
	{
		this.root = null;
		this.sum = 0;
	}
	// insert a node in BST
	fun addNode(data: Int): Unit
	{
		// Create new node of tree
		val node: TreeNode = TreeNode(data);
		if (this.root == null)
		{
			this.root = node;
		}
		else
		{
			var auxiliary: TreeNode ? = this.root;
			// Add new node in binary search tree
			while (auxiliary != null)
			{
				if (data > auxiliary.data)
				{
					if (auxiliary.right == null)
					{
						// Add new node at right child
						auxiliary.right = node;
						return;
					}
					auxiliary = auxiliary.right;
				}
				else
				{
					if (auxiliary.left == null)
					{
						// Add new node at left child
						auxiliary.left = node;
						return;
					}
					auxiliary = auxiliary.left;
				}
			}
		}
	}
	// Recursive function
	// Display preorder view of binary search tree
	fun preorder(node: TreeNode ? ): Unit
	{
		if (node != null)
		{
			// Print node value
			print(" " + node.data);
			this.preorder(node.left);
			this.preorder(node.right);
		}
	}
	fun replace(node: TreeNode ? ): Unit
	{
		if (node != null)
		{
			// Visit left subtree
			this.replace(node.left);
			// Add node value
			this.sum = this.sum + node.data;
			// Change node value
			node.data = this.sum;
			// Visit right subtree
			this.replace(node.right);
		}
	}
	fun replaceBySmaller(): Unit
	{
		this.sum = 0;
		this.replace(this.root);
	}
}
fun main(args: Array < String > ): Unit
{
	val tree: BinarySearchTree = BinarySearchTree();
	/*
	         6                            
	       /   \    
	      3     7    
	     / \     \               
	    2   4     12
	   /     \    / 
	  1       5  9
	-----------------
	    Binary Search Tree
	        
	*/
	tree.addNode(6);
	tree.addNode(3);
	tree.addNode(2);
	tree.addNode(1);
	tree.addNode(4);
	tree.addNode(5);
	tree.addNode(7);
	tree.addNode(12);
	tree.addNode(9);
	print("\n Before Tree Element : ");
	tree.preorder(tree.root);
	/*
	          (15+6)
	             21  
	            /   \                          
	    (1+2+3)/     \    
	          6       28  (21+7)
	         / \       \ 
	        /   \       \               
	  (1+2)3    10(6+4)  49(37+12)
	      /       \      / 
	     /         \    /
	    1          15  37
	            (10+5) (28+9)
	    -----------------
	    Resultant Binary Search Tree
	        
	*/
	tree.replaceBySmaller();
	print("\n After Tree Element : ");
	tree.preorder(tree.root);
}

Output

 Before Tree Element :  6 3 2 1 4 5 7 12 9
 After Tree Element :  21 6 3 1 10 15 28 49 37




Comment

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