有关c程序指针的问题

时间:2017-05-14 16:18:15

标签: c

我编写了打算执行二叉搜索树的有序遍历的代码,并找到任意两个节点的值之间的最小绝对差值。我编写此代码,当我运行此测试用例时,它不会返回结果1,而是抛出结果2.

以下是测试用例:

bst

这是我写的代码:

   2 
 /   \
1     4

这是printf的输出:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

void inOrder(struct TreeNode* temp1, struct TreeNode* temp2, int* result) {
    if (temp1->left != NULL) {
        inOrder(temp1->left, temp2, result);
    }
    if (temp2 != NULL) {
        int dif = temp1 -> val - temp2 -> val;
        *result = *result > dif ? dif : *result;
    }
    printf("%p\n", temp2);
    temp2 = temp1;
    if (temp1->right != NULL) {
        inOrder(temp1->right, temp2, result);
    }
}

int getMinimumDifference(struct TreeNode* root) {
    int result  = 0x7fffffff;
    struct TreeNode* temp = NULL;
    inOrder(root, temp, &result);
    return result;
}

如您所见,只有最后一个节点不为空。这是不正常的,因为基于代码的逻辑应该有两个非空打印。

那么请你帮我解决这个错误?

1 个答案:

答案 0 :(得分:0)

在您的代码temp2中始终为NULL 请尝试以下代码段

void inOrder(struct TreeNode* temp1, struct TreeNode* temp2, int* result) {
    if (temp1->left != NULL) {
        inOrder(temp1->left, temp1, result);
    }
    if (temp2 != NULL) {
        int dif = temp1 -> val - temp2 -> val;
        if(dif < 0) dif *= -1; //absolute diff
        *result = *result > dif ? dif : *result;
    }
    printf("%p\n", temp2);
    //temp2 = temp1;
    if (temp1->right != NULL) {
        inOrder(temp1->right, temp1, result);
    }
}