Given a binary search tree with non-negative values, find the minimum absolute difference between values of any two nodes.
Example:
Input:
1
\
3
/
2
Output:
1
Explanation:
The minimum absolute difference is 1, which is the difference between 2 and 1 (or between 2 and 3).
Note: There are at least two nodes in this BST.
分析:
目标——找到二叉搜索树的任意两个节点绝对差的最小值
首先,看二叉搜索树,左子树所有节点 < 根节点 < 右子树所有节点。
按深度优先搜索, 节点从大到小排序可得: 3, 2, 1. 只需计算相邻两个节点间的差值,找到最小差值。
扫描二维码关注公众号,回复:
2564613 查看本文章
难点:计算第一个差值。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int getMinimumDifference(struct TreeNode* root) {
int md=0, next=0;
struct TreeNode *Max = root;
// find max node
while(NULL != (Max->right)) Max = Max->right;
process(root, Max, &next, &md);
return md;
}
void process(struct TreeNode* root, struct TreeNode* Max, int *next, int *md){
if(NULL != root){
process(root->right, Max, md, next);
if(root == Max) {// 1st difference
*md = *next = root->val;
}else{
int a1, a2;
a1= root->val;
a2 = (*next);
if(*md - (a1-a2) < 0)
*md = a1 - a2;
}
next = root->val;
process(root->left, Max, md, next);
}
}
问题1:load of misaligned address 0x000000835093 for type ‘int’
指针不对齐.
next = root->val;
倒数第4行:next前面忘了加*。
【注意】1.测试简单case 2. 在本地调试。
问题2:边界条件
int getMinimumDifference(struct TreeNode* root) {
int md, bigger;
struct TreeNode *MaxNode = root, *MinNode = root;
while(NULL != (MaxNode->right)) MaxNode = MaxNode->right;
while(NULL != (MinNode->left)) MinNode = MinNode->left;
md = MaxNode->val - MinNode->val;
bigger = MaxNode->val + md;
process(root, &bigger, &md);
return md;
}
void process(struct TreeNode* root, int &bigger, int &md){
if(NULL != root){
process(root->right, bigger, md);
if(md > bigger - root->val)
md = bigger - root->val;
bigger = root->val;
process(root->left, bigger, md);
}
}
思路:
1. md初始化为max - min,即节点间最大差值。
2. 从大到小比较相邻两节点差值和md,留下较小的。
注意:Max->val + md可能越界