我编写了打算执行二叉搜索树的有序遍历的代码,并找到任意两个节点的值之间的最小绝对差值。我编写此代码,当我运行此测试用例时,它不会返回结果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;
}
如您所见,只有最后一个节点不为空。这是不正常的,因为基于代码的逻辑应该有两个非空打印。
那么请你帮我解决这个错误?
答案 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);
}
}