【问题标题】:Find the root node of a binary tree查找二叉树的根节点
【发布时间】:2018-01-28 15:51:27
【问题描述】:

这是采访中提出的问题之一。我需要在哪里找到二叉树的根节点。在下面的二叉树定义中没有像(Node parent)这样的父节点。

我们可以访问二叉树中的任何节点。它可以是根节点,也可以是任何其他节点。

二叉树:

                1
              /   \
             2     3
            / \   / \
           4   5 6   7

我们可能可以访问节点 5

二叉树的定义如下:

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

任何想法我可以如何实现这一点。

public Node getParent(Node current)
{

}

谢谢!

【问题讨论】:

  • 你刚刚在这里问了一个问题stackoverflow.com/questions/48488113/balanced-bracket-questions。你应该自己尝试过。回来后你有什么尝试??
  • 请不要在这个网站上倾倒你的面试问题,而不是展示你自己的努力。
  • 如果你可以访问树中的任何节点,你可以遍历每个节点,看看你从哪个节点得到最多的孩子。这将在O(n^2) 中运行
  • 有趣。如果您只能访问节点 5(以及从那里的子节点)而没有其他节点,我看不出这怎么可能。如果您可以访问所有节点,例如 List,您可以在那里查找其父节点,并最终找到根节点。 (但有点慢)
  • 同样,这是一个问答网站,而不是编码面试存储库。通过查看我们对此类问题的答案,您将一无所获。

标签: java tree binary-tree


【解决方案1】:

实际上,图中可能有很多根,即没有父节点的节点,或者根本没有被另一个节点引用。

您可以遍历所有节点 1 次,并将遇到的子节点放入一个 Set 中。根(没有父节点的节点)是树中所有节点与集合中节点之间的差异。

这将在 O(N) 中工作,N 是节点数,只要 equals/hashCode 方法速度快。如果节点在内存中没有重复,您将能够为相等/hashCode 引用内存并且速度非常快。

但这只是一种随机解决方案。您可能希望更改数据结构,例如在一侧拥有所有节点,而在另一侧拥有指向根的指针,这样访问就变成了 O(1)。

您应该查看一本关于算法的书,以了解所有可能的解决方案,了解它们的优点和缺点。

希望在面试中,面试官寻找的不一定是你知道答案,而是你能够理解问题,提出问题以确保你做对了,即使很幼稚,也至少找到一个解决方案,能够批评它并可能知道改进它的方法(比如阅读关于算法的书)。

【讨论】:

  • 1) 问题表明它是一棵树(不是图);所以有一个根。 2)我建议不要从空白集开始,而是首先用所有节点填充 Set,然后删除子节点。这样,集合中剩下的节点就是根节点了。
  • 总的来说,这非常相似......两个代码都迭代了两次,并且都遍历了两次数据。单根假设根本没有必要。在所有情况下,我们都会找到所有根,无论是一个还是一百个;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多