【发布时间】:2010-12-01 03:10:17
【问题描述】:
树节点包含 3 个指针 *left、*right 和 *Successor。
Struct node{
int data;
struct node *left;
struct node *right;
struct node *successor;
};
A
/ \
B C
/ \ / \
D E F G
INORDER 遍历:DBEAFCG *注意:* 顺序后继是 F、C 和 G。
**Function prototype:** void FillSuccessorNodes( struct node *root);
树的根节点给了我们,我们需要为所有节点填充后继指针。
case 1) 一些 Successor 指针可能是 NULL 。在这种情况下,您必须使用立即的 Inorder Successor 填充该指针。
示例:如果 A->Successor == NULL,则填写 A->Successor = F
case 2) 一些 Successor 指针可能已经指向正确的后继者。这种情况下不需要修改后继指针。
示例:1) A->successor = F 有效
2) A->successor = C is valid
3) A-successor = G is valid . All these three cases you no need to modify successor pointer since these already pointing to correct successor nodes.
case 3) 一些后继指针 not NULL 但这些指针指向无效后继,即它可能是无序后继或一些垃圾值。在这种情况下,您必须使用直接后继节点填充这些节点。
例子:
1) A->successor = B is invalid since B is not successor node , so we have to correct it to A->successor = F.
2) A->successor = 0x23237463478 is invalid since it is pointing to garbage value. So we we have to correct it to A->successor = F.
1) 面试官问我 O(n) 时间复杂度的时间效率解决方案。允许额外的空间。 2) 她给出了一些提示,即我们可以使用 HASHing。
如果您知道此问题的解决方案,请告诉我。
【问题讨论】:
-
这是对正常中序遍历的相当直接的修改。编写代码,并考虑如何找到当前节点的继任者。
-
@siva : 你有 O(n) 解决方案吗?
标签: algorithm data-structures recursion tree