找到二叉树的根节点

时间:2018-01-28 15:51:28

标签: java tree binary-tree

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

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

二叉树:

                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)
{

}

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

这将在O(N)中起作用,只要equals / hashCode方法很快,N就是节点数。如果节点没有在内存中重复,那么你可以使用相等/ hashCode的内存引用,并且非常快。

但这只是一个随机解决方案。您可能希望更改数据结构,例如,在一侧具有所有节点,在另一侧具有指向根的指针,因此访问变为O(1)。

你应该检查一本关于算法的书,看看所有可能的解决方案,这些解决方案都有其优点和缺点。

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