因为是二叉搜索树,那么我们一定使用中序遍历,这样可以保证按从小到大的顺序遍历节点数值。要求两个节点的最小绝对差,我们这里可以使用到双指针法,让一个指针指向当前遍历到的节点,另一个指针遍历前一个节点(这里的前一个节点指的是按照中序遍历的顺序的前一个节点)。每遍历到一个新的节点都可以更新一下最小的差值,差值用一个全局变量存储。根据这个思路,我们可以发现这个递归函数并不需要返回任何值,只需要遍历所有节点即可。大家可以结合我下面的代码及注释理解。
代码及注释如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
//最开始将result设置得非常大,方便后续更新最小差值
int result = 1000000000;
TreeNode* pre = NULL;
void travel(TreeNode* cur){
//终止条件
if(cur == NULL) return ;
//递归左子树
getMinimumDifference(cur -> left);
if(pre != NULL) result = min(result,cur -> val - pre -> val);
//pre指针跟着cur指针一起后移
pre = cur;
//递归右子树
getMinimumDifference(cur -> right);
return;
}
int getMinimumDifference(TreeNode* root) {
travel(root);
return result;
}
};
1310

被折叠的 条评论
为什么被折叠?



