LeetCode530. Minimum Absolute Difference in BST

二叉搜索树中的最小绝对差


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可能越界

猜你喜欢

转载自blog.csdn.net/cp_oldy/article/details/81415670