Java教程

Java在二叉树中查找最大距离的节点

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

算法

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

程序:

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<
        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);
    }
}
输出:
Nodes which are at maximum distance:
( 4, 9 )
( 5, 9 )
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4