[LeetCode] Minimum Absolute Difference in BST 二叉搜索树的最小绝对差
2017-03-12 23:17
561 查看
Given a binary search tree with non-negative values, find the minimum absolute difference between values of any two nodes.
Example:
Note: There are at least two nodes in this BST.
这道题给了我们一棵二叉搜索树,让我们求任意个节点值之间的最小绝对差。由于BST的左<根<右的性质可知,如果按照中序遍历会得到一个有序数组,那么最小绝对差肯定在相邻的两个节点值之间产生。所以我们的做法就是对BST进行中序遍历,然后当前节点值和之前节点值求绝对差并更新结果res。这里需要注意的就是在处理第一个节点值时,由于其没有前节点,所以不能求绝对差。这里我们用变量pre来表示前节点值,这里由于题目中说明了所以节点值不为负数,所以我们给pre初始化-1,这样我们就知道pre是否存在。如果没有题目中的这个非负条件,那么就不能用int变量来,必须要用指针,通过来判断是否为指向空来判断前结点是否存在。还好这里简化了问题,用-1就能搞定了,这里我们先来看中序遍历的递归写法,参见代码如下:
解法一:
其实我们也不必非要用中序遍历不可,用先序遍历同样可以利用到BST的性质,我们带两个变量low和high来分别表示上下界,初始化为int的极值,然后我们在递归函数中,分别用上下界和当前节点值的绝对差来更新结果res,参见代码如下:
解法二:
下面这种方法是解法一的迭代的写法,思路跟之前的解法没有什么区别,参见代码如下:
解法三:
参考资料:
https://discuss.leetcode.com/topic/80896/my-solution-using-no-recursive-in-order-binary-tree-iteration
https://discuss.leetcode.com/topic/80823/two-solutions-in-order-traversal-and-a-more-general-way-using-treeset/2
https://discuss.leetcode.com/topic/80916/java-no-in-order-traverse-solution-just-pass-upper-bound-and-lower-bound
LeetCode All in One 题目讲解汇总(持续更新中...)
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.
这道题给了我们一棵二叉搜索树,让我们求任意个节点值之间的最小绝对差。由于BST的左<根<右的性质可知,如果按照中序遍历会得到一个有序数组,那么最小绝对差肯定在相邻的两个节点值之间产生。所以我们的做法就是对BST进行中序遍历,然后当前节点值和之前节点值求绝对差并更新结果res。这里需要注意的就是在处理第一个节点值时,由于其没有前节点,所以不能求绝对差。这里我们用变量pre来表示前节点值,这里由于题目中说明了所以节点值不为负数,所以我们给pre初始化-1,这样我们就知道pre是否存在。如果没有题目中的这个非负条件,那么就不能用int变量来,必须要用指针,通过来判断是否为指向空来判断前结点是否存在。还好这里简化了问题,用-1就能搞定了,这里我们先来看中序遍历的递归写法,参见代码如下:
解法一:
class Solution { public: int getMinimumDifference(TreeNode* root) { int res = INT_MAX, pre = -1; inorder(root, pre, res); return res; } void inorder(TreeNode* root, int& pre, int& res) { if (!root) return; inorder(root->left, pre, res); if (pre != -1) res = min(res, root->val - pre); pre = root->val; inorder(root->right, pre, res); } };
其实我们也不必非要用中序遍历不可,用先序遍历同样可以利用到BST的性质,我们带两个变量low和high来分别表示上下界,初始化为int的极值,然后我们在递归函数中,分别用上下界和当前节点值的绝对差来更新结果res,参见代码如下:
解法二:
class Solution { public: int getMinimumDifference(TreeNode* root) { int res = INT_MAX; helper(root, INT_MIN, INT_MAX, res); return res; } void helper(TreeNode* root, int low, int high, int& res) { if (!root) return; if (low != INT_MIN) res = min(res, root->val - low); if (high != INT_MAX) res = min(res, high - root->val); helper(root->left, low, root->val, res); helper(root->right, root->val, high, res); } };
下面这种方法是解法一的迭代的写法,思路跟之前的解法没有什么区别,参见代码如下:
解法三:
class Solution { public: int getMinimumDifference(TreeNode* root) { int res = INT_MAX, pre = -1; stack<TreeNode*> st; TreeNode *p = root; while (p || !st.empty()) { while (p) { st.push(p); p = p->left; } p = st.top(); st.pop(); if (pre != -1) res = min(res, p->val - pre); pre = p->val; p = p->right; } return res; } };
参考资料:
https://discuss.leetcode.com/topic/80896/my-solution-using-no-recursive-in-order-binary-tree-iteration
https://discuss.leetcode.com/topic/80823/two-solutions-in-order-traversal-and-a-more-general-way-using-treeset/2
https://discuss.leetcode.com/topic/80916/java-no-in-order-traverse-solution-just-pass-upper-bound-and-lower-bound
LeetCode All in One 题目讲解汇总(持续更新中...)
相关文章推荐
- leetcode Minimum Absolute Difference in BST 二叉搜索树中的最小差
- [LeetCode]530. Minimum Absolute Difference in BST(BST的最小绝对差)
- LeetCode 530. Minimum Absolute Difference in BST (二叉搜索树中最小绝对差)
- LeetCode 530 Minimum Absolute Difference in BST(BST中序遍历)
- LeetCode 530 Minimum Absolute Difference in BST
- leetcode[Minimum Absolute Difference in BST]//待整理多种解法
- Leetcode 530 Minimum Absolute Difference in BST
- 【LeetCode】Minimum Absolute Difference in BST 解题报告
- Leetcode Minimum Absolute Difference in BST
- LeetCode Minimum Absolute Difference in BST
- leetcode-Minimum Absolute Difference in BST
- [leetcode]-530. Minimum Absolute Difference in BST
- Minimum Absolute Difference in BST
- Leetcode #530 Minimum Absolute Difference in BST
- Minimum Absolute Difference in BST
- LeetCode 530. Minimum Absolute Difference in BST
- Minimum Absolute Difference in BST
- [LeetCode]530. Minimum Absolute Difference in BST
- [leetcode: Python]530. Minimum Absolute Difference in BST
- leetcode 530. Minimum Absolute Difference in BST