以下函数的目的是什么-树结构

问题描述 投票:0回答:1

我进行了测试,我需要找出下一个代码的目的是什么:

typedef struct _node* Nodeptr;
typedef struct _node {
    int data;
    Nodeptr left;
    Nodeptr right;
} Node;

int F(Nodeptr root, int value) {
    int tmp;

    if (root == NULL)
        return -1;

    if (root->left == NULL && root->right == NULL) {
        tmp = root->data;
        root->data = value;
        return tmp;
    }

    root->data = F(root->left, root->data);

    return F(root->right, value);
}

在哪里调用 F(root,root->data) 代码的目的是什么?

我的想法是代码以与 InOrderTraversal 类似的顺序更改节点值,但我认为它不准确。

c tree
1个回答
0
投票

这就是代码实现的效果:

  • 每个具有后继节点的叶子都会将其值与其后继节点的值交换。叶子的后继节点是其 left 子树中具有该叶子的最近节点。

  • 如果存在没有后继节点的叶子,则其值将设置为在函数的顶级调用中作为第二个参数传递的任何值,并且该函数调用返回该叶子的原始值。如果不存在这样的叶子(没有后继节点),则该函数的顶层调用将返回 -1。

  • 任何未通过上述两种机制更新其值的节点都会收到值-1。这些是内部节点,没有叶子作为前驱节点。

以我的愚见,这对于一个函数来说似乎是一个奇怪的结果,我看不出它有什么用处:一些值被交换,其他值丢失,如果顶级函数作为第二个参数传递

root->data
,就像你一样已经指出,那么该值可能会在更新的树中出现两次。我想知道这是否是这个测试的设计者真正的想法,或者他们是否有其他意图。

© www.soinside.com 2019 - 2024. All rights reserved.