📌  相关文章
📜  数据结构示例-找到一棵二叉树中最大距离的节点

📅  最后修改于: 2020-10-15 06:40:07             🧑  作者: Mango

Q.程序以查找二叉树中最大距离的节点。

说明

在此程序中,我们需要找出二叉树中距离最大的节点。根据我们的方法,树的所有节点之间的所有距离将保持在可变距离内。通过使用变量MaxDistance可以保留具有最大值的距离。最初,MaxDistance初始化为distance的值。如果发现任何大于MaxDistance的值,则覆盖MaxDistance的值。

重复此过程,直到找到树的两个节点之间的最大可能距离。该过程的算法如下。

算法

  • 定义具有三个属性的Node类,即: leftright数据。在此,左代表节点的左子节点,右代表节点的右子节点。
  • 创建节点时,数据将传递到该节点的data属性,并且left和right都将设置为null
  • 定义另一个具有两个属性root和treeArray的类。
    1. 表示树的根节点,并将其初始化为null。
    2. treeArray将存储二叉树的数组表示形式。
  • nodeAtMaxDistance()将找出以最大距离存在的节点:
    1. 它将计算二叉树中所有节点之间的距离并将其存储在可变距离中。
    2. MaxDistance跟踪节点之间的最大可能距离。如果maxDistance小于distance,则distance的值将存储在maxDistance中。清除数组以摆脱以前存储的值。最大距离的节点将存储在数组arr中。
    3. 如果在maxDistance处有一对以上的节点,则将它们存储在数组arr中。
  • computeSize()将计算树中存在的节点数。
  • convertBTtoArray()将通过遍历二叉树并将元素添加到treeArray来将二叉树转换为其数组表示形式。
  • getDistance()将计算给定节点到根的距离。
  • LowestCommonAncestor()将找出节点n1和n2的最低公共祖先。
    1. 如果任何一个节点都等于根节点,则将root作为最低的公共祖先返回。
    2. 否则,在左子树和右子树中搜索节点n1和n2。
    3. 如果找到一个节点,则n1是该节点的左子节点,而n2是该节点的右子节点,反之亦然。返回该节点作为最低公共祖先。
  • FindDistance()将计算两个节点之间的距离。
    1. 首先,它计算每个节点到根节点的距离。
    2. 从该根节点减去最低共同祖先的2 *距离

示例:

Python

#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);

输出:

Nodes which are at maximum distance: 
( 4,9 )
( 5,9 )

C

#include 
#include 
#include 
 
//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;
} 

输出:

Nodes which are at maximum distance: 
( 4,9 )
( 5,9 )

JAVA

import 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 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);
      }
}

输出:

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{
            public T data;
            public Node left;
            public Node 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{
            //Represent the root of binary tree
            public Node root;
            
            T[] treeArray;
            int index = 0;
            
            public MaxDistance(){
                root = null;
            }
            
            //calculateSize() will calculate size of tree
            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 the given binary tree to its corresponding array representation
            public void convertBTtoArray(Node 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 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 lowestCommonAncestor(Node 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 left = lowestCommonAncestor(temp.left, n1, n2);
                    Node 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 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 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 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);                
        }    
    }
}

输出:

Nodes which are at maximum distance: 
( 4,9 )
( 5,9 )

PHP:




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 
"); 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:
"); for($i = 0; $i < sizeof($arr); $i = $i + 2) { print("( " . $arr[$i] . "," . $arr[$i+1] . " )"); print("
"); } } } $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); ?>

输出:

Nodes which are at maximum distance: 
( 4,9 )
( 5,9 )