当前位置: 首页 > 知识库问答 >
问题:

如何在二叉树中找到同一层次上两个节点之间的水平距离?

公冶谦
2023-03-14

给定一棵二叉树:高度为3的二叉树

我想找出同一水平上两个节点之间的水平距离,也计算不在中间的节点,而不计算节点本身,比如在

          f
      /         \
     g           h      
    /  \        /  \        
  a                d    

节点a和d之间的水平距离为2。

编辑:

请参见,a到d之间的距离是在同一级别上计算的,不包括a或d的父节点或子节点,但只包括同一级别上缺少的节点。所以a到d之间的距离是

共有3个答案

叶经略
2023-03-14
Here is the code:

/**
* 
* @author satish hawalppagol
*
*/



public class BinaryTreeTest
{
    public int findDistance(Node root, int n1, int n2) 
    {

    int leftNodeToRootNode = Pathlength(root, n1, "leftNodeToRootNode") - 2;
    int rightNodeToRootNode = Pathlength(root, n2,"rightNodeToRootNode") - 2;
    int lcaData = findLCA(root, n1, n2).data;   //LCA->Lowest Common Ancestor
    int lcaDistance = Pathlength(root, lcaData,"lcaDistance") - 1;
    return (leftNodeToRootNode + rightNodeToRootNode) - 2 * lcaDistance;

    }

    public int Pathlength(Node root, int n1,String callingFrom) 
    {

    if (root != null) 
    {

        int x = 0;

        if("rightNodeToRootNode" == callingFrom)
        {

            if(root.left ==null && root.right ==null)
            {
                //do nothing
            }
            else if(root.left ==null || root.right ==null)
            {
                System.out.println("counting the position where the node is not 
                present is : "   +   root.data);
            }
            if ((root.data == n1) || (x = Pathlength(root.left, 
               n1,"rightNodeToRootNode")) > 0  || (x = Pathlength(root.right, 
               n1,"rightNodeToRootNode")) > 0) 
            {
                return x + 1;
            }
        }
        if("rightNodeToRootNode" != callingFrom )
        {

            if ((root.data == n1) || (x = Pathlength(root.left, 
            n1,"leftNodeToRootNode")) > 0  || (x = Pathlength(root.right, 
            n1,"leftNodeToRootNode")) > 0) 
            {
                return x + 1;
            }
        }

        return 0;
    }
    return 0;
}

public Node findLCA(Node root, int n1, int n2) 
{

    if (root != null)
    {

        if (root.data == n1 || root.data == n2) 
        {
            return root;
        }
        Node left = findLCA(root.left, n1, n2);
        Node right = findLCA(root.right, n1, n2);

        if (left != null && right != null)
        {
            return root;
        }
        if (left != null) 
        {
            return left;
        }
        if (right != null)
        {
            return right;
        }
    }
    return null;
}

public static void main(String[] args) throws java.lang.Exception 
{

    Node root = new Node(5);
    root.left = new Node(2);
    root.right = new Node(3);
    /*root.left.right = new Node(12);*/
    root.left.left = new Node(7);
    root.left.left.left = new Node(9);
    /*root.left.left.right = new Node(17);*/

    root.right.right = new Node(1);
    /*root.right.right.left = new Node(4);*/
    root.right.right.right = new Node(6);

    BinaryTreeTest binaryTreeTest = new BinaryTreeTest();
    System.out.println("Distance between 9 and 6 is : " + 
    binaryTreeTest.findDistance(root,9, 6));
    }

}

class Node 
{
int data;
Node left;
Node right;

    public Node(int data) 
    {
    this.data = data;
    this.left = null;
    this.right = null;
    }
}


///////////input/////////   
//          5          //   
//        /    \       //   
//       2     3       //   
//      / \      \     //   
//     7          1    //   
//    /  \       /  \  // 
//   9               6 // 
///////////input/////////   

counting the position where the node is not present is : 2
counting the position where the node is not present is : 7
counting the position where the node is not present is : 3
counting the position where the node is not present is : 1
Distance between 9 and 6 is : 4
茹轩昂
2023-03-14

就内存而言,这是一种可能不是最佳解决方案的方法。

因此,欢迎提出建议/改进。

算法-

  • 使用广度优先搜索(级别顺序)方法遍历BT 遍历时,考虑空白(节点不存在)为“-1”
  • 在数组中插入BFS路径元素,查找要查找的2个节点元素的索引
  • 使用索引计算距离

复杂性-时间:O(N)空间:O(N)

假设-BT中的每个节点都有唯一的值。

class Node {
  Node() {
    value = -1;
  }
  Node(int num) {
    value = num;
  }
  int value;
  Node left = null;
  Node right = null;
}

声明一些必需的DS

static Queue<Node> queue = new LinkedList<Node>();
static ArrayList<Integer> list = new ArrayList<Integer>();
static Set<Integer> set = new HashSet<Integer>();

然后是三个功能

 static void convertBTToArray() {
    if (set.isEmpty())
      return;
 
    Node node = queue.poll();
 
    if (node != null) {
      list.add(node.value);
 
      if (node.value != -1)
        set.remove(node.value);
 
      if (node.left != null) {
        queue.add(node.left);
        set.add(node.left.value);
      } else
        queue.add(new Node());
      if (node.right != null) {
        queue.add(node.right);
        set.add(node.right.value);
      } else
        queue.add(new Node());
 
      convertBTToArray();
 
    } else
      return;
  }
 
 
  static void init(Node root) {
    // traverse in BFS fashion (level order) and convert to Array.
    Node rootCopy = root;
    if (rootCopy != null) {
      queue.add(rootCopy);
      set.add(rootCopy.value);
      convertBTToArray();
    }
  }
 
    // get distance between start and end values.
  static int getHorizontalDistance(int startValue, int endValue) {
    int startIndex = -1, endIndex = -1;
    for (int i = 0; i < list.size(); i++) {
      if (startIndex == -1)
        startIndex = list.get(i) == startValue ? i : -1;
 
      if (list.get(i) == endValue) {
        endIndex = i;
        break;
      }
    }
 
    // check if both numbers are from same level else return -1
    if (Math.floor(Math.log(startIndex + 1) / Math.log(2)) >= 0
      && Math.floor(Math.log(endIndex + 1) / Math.log(2)) >= 0)
      return (endIndex - startIndex - 1);
    else
      return -1;
  }

最后是主要方法

public static void main(String...s) {
    // create your tree and enter elements here

    // -1 indicates that distance cant be found and hence invalid input.
    System.out.println("Dist(7,1): "+getHorizontalDistance(7, 1));
    
  }
凌翔宇
2023-03-14

这样想:

      a
    /   \
   b      c
  /  \   / \
 e    f g   h

现在,您需要确定同一级别上节点之间的水平距离。例如:f和g。这里有一个逐步的方法:

  1. 执行二叉树的级别顺序遍历,并将值存储在数组中

更新:正如anand_v.singh所指出的,如果树可能没有在所有级别上完全填充,那么它可能会产生错误的结果
为克服此问题,将确定一个名为树高的附加参数。假设树的高度为3,那么数组将最多包含2个tree\u height-1元素,所有元素都初始化为不等于任何树节点值的值。现在,您可以使用类似于二进制堆的数组表示的东西,将节点值放置到数组中,并在其各自的索引处。然后按照上述步骤获得结果。

 类似资料:
  • 有谁能帮助我理解下面的算法,如何找出二叉树中任意两个节点之间的最大差异。 http://www.geeksforgeeks.org/maximum-difference-between-node-and-its-ancestor-in-binary-tree/ 我不明白为什么他们试图从左子树和右子树得到最小值,而实际上我们想要最大的差异 提前谢谢!!

  • 我被这个问题的修改版本困住了(在二叉树中找到距离为k的两个节点)。 我试图定义两个节点之间的距离,我认为这是沿着树状分支从节点n1移动到节点n2所需的最小节点数。 从这个假设出发,我得到了一个情况,我认为我需要知道每个节点是在根的左边还是右边。 案例1:如果n1和n2位于不同的一侧,那么我爬到根部(距离等于节点n1的深度-假设n1位于左侧),然后向下跑到右侧节点n2(距离等于节点n2的深度)。所以

  • 我试图找到树中两个节点之间的最大距离。这是我的程序: 程序似乎正在运行;但是没有为一些测试用例显示正确的输出。我采取的方法是: 求根节点的子节点数(我一直认为根节点为0)。 找到每个子树的最大深度(尽可能多的子树,因为有根节点的子节点)。 将每个子树的最大深度存储在中,对其进行排序并打印最后两个值的总和。 有人能指出我程序中的错误吗?

  • 问题内容: 假设我有x1,y1,还有x2,y2。 我如何找到它们之间的距离?这是一个简单的数学函数,但是此在线代码段吗? 问题答案: dist = sqrt( (x2 - x1)2 + (y2 - y1)2 ) 正如其他人指出的那样,您也可以使用等效的内置函数:

  • 本文向大家介绍如何打印二叉树每层的节点?相关面试题,主要包含被问及如何打印二叉树每层的节点?时的应答技巧和注意事项,需要的朋友参考一下 考察点:二叉树   实现代码:  

  • 我正在研究合并两个二叉树的问题(https://www.geeksforgeeks.org/merge-two-binary-trees-node-sum/)我很难理解一些递归。为什么要将递归语句设置为和?当你这样做的时候,是否等于两个值? 我只是不确定为什么我们要将递归语句设置为t1.leftt1.right'