这是采访中提出的问题之一。我需要在哪里找到二叉树的根节点。在下面的二叉树定义中没有类似(节点父节点)的父节点。
我们可以访问二叉树中的任何节点。它可以是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)
{
}
谢谢!
答案 0 :(得分:0)
实际上图中可能有很多根,即没有父节点的节点或者根本没有其他节点引用。
您可以遍历所有节点1,并将遇到的子节点放入Set中。根(没有父节点的节点)是树中所有节点和集合中节点之间的差异。
这将在O(N)中起作用,只要equals / hashCode方法很快,N就是节点数。如果节点没有在内存中重复,那么你可以使用相等/ hashCode的内存引用,并且非常快。
但这只是一个随机解决方案。您可能希望更改数据结构,例如,在一侧具有所有节点,在另一侧具有指向根的指针,因此访问变为O(1)。
你应该检查一本关于算法的书,看看所有可能的解决方案,这些解决方案都有其优点和缺点。
希望面试时,面试官所寻找的并不一定是你知道答案,而是你能够理解问题,提出问题以确保你做对了,即使天真地找到至少一个解决方案,能够批评它并且可能知道改进它的方式(比如阅读关于算法的书)。