C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML
Q. Program to find the nodes which are at the maximum distance in a Binary Tree.ExplanationIn this program, we need to find out the nodes which are at the maximum distance in the binary tree. According to our approach, all the distances between all the nodes of the tree will be kept in the variable distance. The distance with the maximum value will be kept by using the variable MaxDistance. Initially, MaxDistance is initialized with the value of distance. If any value is found greater than MaxDistance, overwrite the value of MaxDistance. Repeat this process until we find the maximum possible distance between two nodes of the tree. The algorithm of the process is given below. Algorithm
SolutionPython#Represent a node of binary tree class Node: def __init__(self,data): #Assign data to the new node, set left and right children to None self.data = data; self.left = None; self.right = None; class MaxDistance: def __init__(self): #Represent the root of binary tree self.root = None; self.treeArray = []; #convertBTtoArray() will convert binary tree to its array representation def convertBTtoArray(self, node): #Check whether tree is empty if(self.root == None): print("Tree is empty"); return; else: if(node.left != None): self.convertBTtoArray(node.left); #Adds nodes of binary tree to treeArray self.treeArray.append(node.data); if(node.right != None): self.convertBTtoArray(node.right); #getDistance() will find distance between root and a specific node def getDistance(self, temp, n1): if (temp != None): x = 0; #x will store the count of number of edges between temp and node n1 if (temp.data == n1): return x + 1; x = self.getDistance(temp.left, n1); if(x > 0): return x + 1; x = self.getDistance(temp.right, n1); if(x > 0): return x + 1; return 0; return 0; #lowestCommonAncestor() will find out the lowest common ancestor for nodes node1 and node2 def lowestCommonAncestor(self, temp, n1, n2): if (temp != None): #If root is equal to either of node node1 or node2, return root if (temp.data == n1 or temp.data == n2): return temp; #Traverse through left and right subtree left = self.lowestCommonAncestor(temp.left, n1, n2); right = self.lowestCommonAncestor(temp.right, n1, n2); #If node temp has one node(node1 or node2) as left child and one node(node1 or node2) as right child #Then, return node temp as lowest common ancestor if (left != None and right != None): return temp; #If nodes node1 and node2 are in left subtree if (left != None): return left; #If nodes node1 and node2 are in right subtree if (right != None): return right; return None; #findDistance() will find distance between two given nodes def findDistance(self, node1, node2): #Calculates distance of first node from root d1 = self.getDistance(self.root, node1) - 1; #Calculates distance of second node from root d2 = self.getDistance(self.root, node2) - 1; #Calculates lowest common ancestor of both the nodes ancestor = self.lowestCommonAncestor(self.root, node1, node2); #If lowest common ancestor is other than root then, subtract 2 * (distance of root to ancestor) d3 = self.getDistance(self.root, ancestor.data) - 1; return (d1 + d2) - 2 * d3; #nodesAtMaxDistance() will display the nodes which are at maximum distance def nodesAtMaxDistance(self, node): maxDistance = 0; distance = 0; arr = []; #Convert binary tree to its array representation self.convertBTtoArray(node); for i in range(0, len(self.treeArray)): for j in range(i, len(self.treeArray)): #If distance is greater than maxDistance then, maxDistance will hold the value of distance distance = self.findDistance(self.treeArray[i], self.treeArray[j]); if(distance > maxDistance): maxDistance = distance; #Clear the arr arr.clear(); #Add nodes at position i and j to treeArray arr.append(self.treeArray[i]); arr.append(self.treeArray[j]); #If more than one pair of nodes are at maxDistance then, add all pairs to treeArray elif(distance == maxDistance): arr.append(self.treeArray[i]); arr.append(self.treeArray[j]); #Display all pair of nodes which are at maximum distance print("Nodes which are at maximum distance: "); for i in range(0, len(arr), 2): print("( " + str(arr[i]) + "," + str(arr[i+1]) + " )"); bt = MaxDistance(); #Add nodes to the binary tree bt.root = Node(1); bt.root.left = Node(2); bt.root.right = Node(3); bt.root.left.left = Node(4); bt.root.left.right = Node(5); bt.root.right.left = Node(6); bt.root.right.right = Node(7); bt.root.right.right.right = Node(8); bt.root.right.right.right.left = Node(9); #Finds out all the pair of nodes which are at maximum distance bt.nodesAtMaxDistance(bt.root); Output: Nodes which are at maximum distance: ( 4,9 ) ( 5,9 ) C#include <stdio.h> #include <stdlib.h> #include <memory.h> //Represent a node of binary tree struct node{ int data; struct node *left; struct node *right; }; //Represent the root of binary tree struct node *root = NULL; int treeArray[50]; int index = 0; //createNode() will create a new node struct node* createNode(int data){ //Create a new node struct node *newNode = (struct node*)malloc(sizeof(struct node)); //Assign data to newNode, set left and right children to NULL newNode->data = data; newNode->left = NULL; newNode->right = NULL; return newNode; } //calculateSize() will calculate size of tree int calculateSize(struct node *node) { int size = 0; if (node == NULL) return 0; else { size = calculateSize (node->left) + calculateSize (node->right) + 1; return size; } } //convertBTtoArray() will convert binary tree to its array representation void convertBTtoArray(struct node *node) { //Check whether tree is empty if(root == NULL){ printf("Tree is empty\n"); return; } else { if(node->left != NULL) convertBTtoArray(node->left); //Adds nodes of binary tree to treeArray treeArray[index] = node->data; index++; if(node->right != NULL) convertBTtoArray(node->right); } } //getDistance() will find distance between root and a specific node int getDistance(struct node *temp, int n1) { if (temp != NULL) { int x = 0; if ((temp->data == n1) || (x = getDistance(temp->left, n1)) > 0 || (x = getDistance(temp->right, n1)) > 0) { //x will store the count of number of edges between temp and node n1 return x + 1; } return 0; } return 0; } //lowestCommonAncestor() will find out the lowest common ancestor for nodes node1 and node2 struct node* lowestCommonAncestor(struct node *temp, int node1, int node2) { if (temp != NULL) { //If root is equal to either of node node1 or node2, return root if (temp->data == node1 || temp->data == node2) { return temp; } //Traverse through left and right subtree struct node *left = lowestCommonAncestor(temp->left, node1, node2); struct node *right = lowestCommonAncestor(temp->right, node1, node2); //If node temp has one node(node1 or node2) as left child and one node(node1 or node2) as right child //Then, return node temp as lowest common ancestor if (left != NULL && right != NULL) { return temp; } //If nodes node1 and node2 are in left subtree if (left != NULL) { return left; } //If nodes node1 and node2 are in right subtree if (right != NULL) { return right; } } return NULL; } //findDistance() will find distance between two given nodes int findDistance(int node1, int node2) { //Calculates distance of first node from root int d1 = getDistance(root, node1) - 1; //Calculates distance of second node from root int d2 = getDistance(root, node2) - 1; //Calculates lowest common ancestor of both the nodes struct node *ancestor = lowestCommonAncestor(root, node1, node2); //If lowest common ancestor is other than root then, subtract 2 * (distance of root to ancestor) int d3 = getDistance(root, ancestor->data) - 1; return (d1 + d2) - 2 * d3; } //nodesAtMaxDistance() will display the nodes which are at maximum distance void nodesAtMaxDistance(struct node *node) { int maxDistance = 0, distance = 0, counter = 0; int arr[50]; //Length of treeArray int treeSize = calculateSize(node); //Convert binary tree to its array representation convertBTtoArray(node); //Calculates distance between all the nodes present in binary tree and stores maximum distance in variable maxDistance for(int i = 0; i < treeSize; i++) { for(int j = i; j < treeSize; j++) { distance = findDistance(treeArray[i], treeArray[j]); //If distance is greater than maxDistance then, maxDistance will hold the value of distance if(distance > maxDistance) { maxDistance = distance; //Clear the arr memset(arr, 0, sizeof(arr)); //Add nodes at position i and j to treeArray arr[counter++] = treeArray[i]; arr[counter++] = treeArray[j]; } //If more than one pair of nodes are at maxDistance then, add all pairs to treeArray else if(distance == maxDistance) { arr[counter++] = treeArray[i]; arr[counter++] = treeArray[j]; } } } int length = sizeof(arr)/sizeof(arr[0]); //Display all pair of nodes which are at maximum distance printf("Nodes which are at maximum distance: "); for(int i = 0; i < length; i = i + 2) { if(arr[i] != 0 && arr[i+1] != 0) printf("\n( %d,%d )", arr[i], arr[i+1]); } } int main() { //Add nodes to the binary tree root = createNode(1); root->left = createNode(2); root->right = createNode(3); root->left->left = createNode(4); root->left->right = createNode(5); root->right->left = createNode(6); root->right->right = createNode(7); root->right->right->right = createNode(8); root->right->right->right->left = createNode(9); //Finds out all the pair of nodes which are at maximum distance nodesAtMaxDistance(root); return 0; } Output: Nodes which are at maximum distance: ( 4,9 ) ( 5,9 ) JAVAimport java.util.ArrayList; public class MaxDistance { //Represent a node of binary tree public static class Node{ int data; Node left; Node right; public Node(int data){ //Assign data to the new node, set left and right children to null this.data = data; this.left = null; this.right = null; } } //Represent the root of binary tree public Node root; int[] treeArray; int index = 0; public MaxDistance(){ root = null; } //calculateSize() will calculate size of tree public int calculateSize(Node node) { int size = 0; if (node == null) return 0; else { size = calculateSize (node.left) + calculateSize (node.right) + 1; return size; } } //convertBTtoArray() will convert binary tree to its array representation public void convertBTtoArray(Node node) { //Check whether tree is empty if(root == null){ System.out.println("Tree is empty"); return; } else { if(node.left != null) convertBTtoArray(node.left); //Adds nodes of binary tree to treeArray treeArray[index] = node.data; index++; if(node.right != null) convertBTtoArray(node.right); } } //getDistance() will find distance between root and a specific node public int getDistance(Node temp, int n1) { if (temp != null) { int x = 0; if ((temp.data == n1) || (x = getDistance(temp.left, n1)) > 0 || (x = getDistance(temp.right, n1)) > 0) { //x will store the count of number of edges between temp and node n1 return x + 1; } return 0; } return 0; } //lowestCommonAncestor() will find out the lowest common ancestor for nodes node1 and node2 public Node lowestCommonAncestor(Node temp, int node1, int node2) { if (temp != null) { //If root is equal to either of node node1 or node2, return root if (temp.data == node1 || temp.data == node2) { return temp; } //Traverse through left and right subtree Node left = lowestCommonAncestor(temp.left, node1, node2); Node right = lowestCommonAncestor(temp.right, node1, node2); //If node temp has one node(node1 or node2) as left child and one node(node1 or node2) as right child //Then, return node temp as lowest common ancestor if (left != null && right != null) { return temp; } //If nodes node1 and node2 are in left subtree if (left != null) { return left; } //If nodes node1 and node2 are in right subtree if (right != null) { return right; } } return null; } //findDistance() will find distance between two given nodes public int findDistance(int node1, int node2) { //Calculates distance of first node from root int d1 = getDistance(root, node1) - 1; //Calculates distance of second node from root int d2 = getDistance(root, node2) - 1; //Calculates lowest common ancestor of both the nodes Node ancestor = lowestCommonAncestor(root, node1, node2); //If lowest common ancestor is other than root then, subtract 2 * (distance of root to ancestor) int d3 = getDistance(root, ancestor.data) - 1; return (d1 + d2) - 2 * d3; } //nodesAtMaxDistance() will display the nodes which are at maximum distance public void nodesAtMaxDistance(Node node) { int maxDistance = 0, distance = 0; ArrayList<Integer> arr = new ArrayList<>(); //Initialize treeArray int treeSize = calculateSize(node); treeArray = new int[treeSize]; //Convert binary tree to its array representation convertBTtoArray(node); //Calculates distance between all the nodes present in binary tree and stores maximum distance in variable maxDistance for(int i = 0; i < treeArray.length; i++) { for(int j = i; j < treeArray.length; j++) { distance = findDistance(treeArray[i], treeArray[j]); //If distance is greater than maxDistance then, maxDistance will hold the value of distance if(distance > maxDistance) { maxDistance = distance; arr.clear(); //Add nodes at position i and j to treeArray arr.add(treeArray[i]); arr.add(treeArray[j]); } //If more than one pair of nodes are at maxDistance then, add all pairs to treeArray else if(distance == maxDistance) { arr.add(treeArray[i]); arr.add(treeArray[j]); } } } //Display all pair of nodes which are at maximum distance System.out.println("Nodes which are at maximum distance: "); for(int i = 0; i < arr.size(); i = i + 2) { System.out.println("( " + arr.get(i) + "," + arr.get(i+1) + " )"); } } public static void main(String[] args) { MaxDistance bt = new MaxDistance(); //Add nodes to the binary tree bt.root = new Node(1); bt.root.left = new Node(2); bt.root.right = new Node(3); bt.root.left.left = new Node(4); bt.root.left.right = new Node(5); bt.root.right.left = new Node(6); bt.root.right.right = new Node(7); bt.root.right.right.right = new Node(8); bt.root.right.right.right.left = new Node(9); //Finds out all the pair of nodes which are at maximum distance bt.nodesAtMaxDistance(bt.root); } } Output: Nodes which are at maximum distance: ( 4,9 ) ( 5,9 ) C#using System; using System.Collections; namespace Tree { public class Program { //Represent a node of binary tree public class Node<T>{ public T data; public Node<T> left; public Node<T> right; public Node(T data) { //Assign data to the new node, set left and right children to null this.data = data; this.left = null; this.right = null; } } public class MaxDistance<T>{ //Represent the root of binary tree public Node<T> root; T[] treeArray; int index = 0; public MaxDistance(){ root = null; } //calculateSize() will calculate size of tree int calculateSize(Node<T> node) { int size = 0; if (node == null) return 0; else { size = calculateSize (node.left) + calculateSize (node.right) + 1; return size; } } //convertBTtoArray() will convert the given binary tree to its corresponding array representation public void convertBTtoArray(Node<T> node) { //Check whether tree is empty if(root == null){ Console.WriteLine("Tree is empty"); return; } else { if(node.left!= null) convertBTtoArray(node.left); //Adds nodes of binary tree to treeArray treeArray[index] = node.data; index++; if(node.right!= null) convertBTtoArray(node.right); } } //getDistance() will find distance between root and a specific node public int getDistance(Node<T> temp, T n1) { if (temp != null) { int x = 0; if ((temp.data.Equals(n1)) || (x = getDistance(temp.left, n1)) > 0 || (x = getDistance(temp.right, n1)) > 0) { //x will store the count of number of edges between temp and node n1 return x + 1; } return 0; } return 0; } //lowestCommonAncestor() will find out the lowest common ancestor for nodes node1 and node2 public Node<T> lowestCommonAncestor(Node<T> temp, T n1, T n2) { if (temp != null) { //If root is equal to either of node node1 or node2, return root if (temp.data.Equals(n1) || temp.data.Equals(n2)) { return temp; } //Traverse through left and right subtree Node<T> left = lowestCommonAncestor(temp.left, n1, n2); Node<T> right = lowestCommonAncestor(temp.right, n1, n2); //If node temp has one node(node1 or node2) as left child and one node(node1 or node2) as right child //Then, return node temp as lowest common ancestor if (left != null && right != null) { return temp; } //If nodes node1 and node2 are in left subtree if (left != null) { return left; } //If nodes node1 and node2 are in right subtree if (right != null) { return right; } } return null; } //findDistance() will find distance between two given nodes public int findDistance(T node1, T node2) { //Calculates distance of first node from root int d1 = getDistance(root, node1) - 1; //Calculates distance of second node from root int d2 = getDistance(root, node2) - 1; //Calculates lowest common ancestor of both the nodes Node<T> ancestor = lowestCommonAncestor(root, node1, node2); //If lowest common ancestor is other than root then, subtract 2 * (distance of root to ancestor) int d3 = getDistance(root, ancestor.data) - 1; return (d1 + d2) - 2 * d3; } //nodesAtMaxDistance() will display the nodes which are at maximum distance public void nodesAtMaxDistance(Node<T> node) { int maxDistance = 0, distance = 0; ArrayList arr = new ArrayList(); //Initialize treeArray int treeSize = calculateSize(node); treeArray = new T[treeSize]; //Convert binary tree to its array representation convertBTtoArray(node); //Calculates distance between all the nodes present in binary tree and stores maximum distance in variable maxDistance for(int i = 0; i < treeArray.Length; i++) { for(int j = i; j < treeArray.Length; j++) { distance = findDistance(treeArray[i], treeArray[j]); //If distance is greater than maxDistance then, maxDistance will hold the value of distance if(distance > maxDistance) { maxDistance = distance; arr.Clear(); //Add nodes at position i and j to treeArray arr.Add(treeArray[i]); arr.Add(treeArray[j]); } //If more than one pair of nodes are at maxDistance then, add all pairs to treeArray else if(distance == maxDistance) { arr.Add(treeArray[i]); arr.Add(treeArray[j]); } } } //Display all pair of nodes which are at maximum distance Console.WriteLine("Nodes which are at maximum distance: "); for(int i = 0; i < arr.Count; i = i + 2) { Console.WriteLine("( " + arr[i] + "," + arr[i+1] + " )"); } } } public static void Main() { MaxDistance<int> bt = new MaxDistance<int>(); //Add nodes to the binary tree bt.root = new Node<int>(1); bt.root.left = new Node<int>(2); bt.root.right = new Node<int>(3); bt.root.left.left = new Node<int>(4); bt.root.left.right = new Node<int>(5); bt.root.right.left = new Node<int>(6); bt.root.right.right = new Node<int>(7); bt.root.right.right.right = new Node<int>(8); bt.root.right.right.right.left = new Node<int>(9); //Finds out all the pair of nodes which are at maximum distance bt.nodesAtMaxDistance(bt.root); } } } Output: Nodes which are at maximum distance: ( 4,9 ) ( 5,9 ) PHP<!DOCTYPE html> <html> <body> <?php //Represent a node of binary tree class Node{ public $data; public $left; public $right; function __construct($data){ //Assign data to the new node, set left and right children to NULL $this->data = $data; $this->left = NULL; $this->right = NULL; } } class MaxDistance{ //Represent the root of binary tree public $root; public $treeArray; function __construct(){ $this->root = NULL; $this->treeArray = array(); } //convertBTtoArray() will convert binary tree to its array representation function convertBTtoArray($node) { //Check whether tree is empty if($this->root == NULL){ print("Tree is empty <br>"); return; } else { if($node->left != NULL) $this->convertBTtoArray($node->left); //Adds nodes of binary tree to treeArray array_push($this->treeArray, $node->data); if($node->right != NULL) $this->convertBTtoArray($node->right); } } //getDistance() will find distance between root and a specific node function getDistance($temp, $n1){ if ($temp != NULL) { $x = 0; if (($temp->data == $n1) || ($x = $this->getDistance($temp->left, $n1)) > 0 || ($x = $this->getDistance($temp->right, $n1)) > 0) { //x will store the count of number of edges between temp and node n1 return $x + 1; } return 0; } return 0; } //lowestCommonAncestor() will find out the lowest common ancestor for nodes node1 and node2 function lowestCommonAncestor($temp, $node1, $node2) { if ($temp != NULL) { //If root is equal to either of node node1 or node2, return root if ($temp->data == $node1 || $temp->data == $node2) { return $temp; } //Traverse through left and right subtree $left = $this->lowestCommonAncestor($temp->left, $node1, $node2); $right = $this->lowestCommonAncestor($temp->right, $node1, $node2); //If node temp has one node(node1 or node2) as left child and one node(node1 or node2) as right child //Then, return node temp as lowest common ancestor if ($left != NULL && $right != NULL) { return $temp; } //If nodes node1 and node2 are in left subtree if ($left != NULL) { return $left; } //If nodes node1 and node2 are in right subtree if ($right != NULL) { return $right; } } return NULL; } //findDistance() will find distance between two given nodes function findDistance($node1, $node2) { //Calculates distance of first node from root $d1 = $this->getDistance($this->root, $node1) - 1; //Calculates distance of second node from root $d2 = $this->getDistance($this->root, $node2) - 1; //Calculates lowest common ancestor of both the nodes $ancestor = $this->lowestCommonAncestor($this->root, $node1, $node2); //If lowest common ancestor is other than root then, subtract 2 * (distance of root to ancestor) $d3 = $this->getDistance($this->root, $ancestor->data) - 1; return ($d1 + $d2) - 2 * $d3; } //nodesAtMaxDistance() will display the nodes which are at maximum distance function nodesAtMaxDistance($node) { $maxDistance = 0; $distance = 0; $arr = array(); //Convert binary tree to its array representation $this->convertBTtoArray($node); //Calculates distance between all the nodes present in binary tree and stores maximum distance in variable maxDistance for($i = 0; $i < count($this->treeArray); $i++) { for($j = $i; $j < count($this->treeArray); $j++) { $distance = $this->findDistance($this->treeArray[$i], $this->treeArray[$j]); //If distance is greater than maxDistance then, maxDistance will hold the value of distance if($distance > $maxDistance) { $maxDistance = $distance; $arr = array(); //Add nodes at position i and j to treeArray array_push($arr, $this->treeArray[$i]); array_push($arr, $this->treeArray[$j]); } //If more than one pair of nodes are at maxDistance then, add all pairs to treeArray else if($distance == $maxDistance) { array_push($arr, $this->treeArray[$i]); array_push($arr, $this->treeArray[$j]); } } } //Display all pair of nodes which are at maximum distance print("Nodes which are at maximum distance: <br>"); for($i = 0; $i < sizeof($arr); $i = $i + 2) { print("( " . $arr[$i] . "," . $arr[$i+1] . " )"); print("<br>"); } } } $bt = new MaxDistance(); //Add nodes to the binary tree $bt->root= new Node(1); $bt->root->left = new Node(2); $bt->root->right = new Node(3); $bt->root->left->left = new Node(4); $bt->root->left->right = new Node(5); $bt->root->right->left = new Node(6); $bt->root->right->right = new Node(7); $bt->root->right->right->right = new Node(8); $bt->root->right->right->right->left = new Node(9); //Finds out all the pair of nodes which are at maximum distance $bt->nodesAtMaxDistance($bt->root); ?> </body> </html> Output: Nodes which are at maximum distance: ( 4,9 ) ( 5,9 )
Next TopicPrograms List
|