mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2026-02-02 18:39:09 +08:00
Update
This commit is contained in:
111
problems/0530.二叉搜索树的最小绝对差.md
Normal file
111
problems/0530.二叉搜索树的最小绝对差.md
Normal file
@@ -0,0 +1,111 @@
|
||||
|
||||
## 题目地址
|
||||
|
||||
https://leetcode-cn.com/problems/minimum-absolute-difference-in-bst/
|
||||
|
||||
## 思路
|
||||
|
||||
题目中要求在二叉搜索树上任意两节点的差的绝对值的最小值。
|
||||
|
||||
**注意是二叉搜索树,**二叉搜索树可是有序的。
|
||||
|
||||
遇到在二叉搜索树上求什么最值啊,差值之类的,就把它想成在一个有序数组上求最值,求差值,这样就简单多了。
|
||||
|
||||
### 递归
|
||||
|
||||
那么二叉搜索树如果采用中序遍历,其实就是一个有序数组。
|
||||
|
||||
**在一个有序数组上求两个数最小差值,这是不是就是一道送分题了。**
|
||||
|
||||
最直观的想法,就是把二叉搜索树转换成有序数组,然后遍历一遍数组,就统计出来最小差值了
|
||||
|
||||
代码如下:
|
||||
|
||||
```
|
||||
class Solution {
|
||||
private:
|
||||
vector<int> vec;
|
||||
void traversal(TreeNode* root) {
|
||||
if (root == NULL) return;
|
||||
traversal(root->left);
|
||||
vec.push_back(root->val); // 将二叉搜索树转换为有序数组
|
||||
traversal(root->right);
|
||||
}
|
||||
public:
|
||||
int getMinimumDifference(TreeNode* root) {
|
||||
vec.clear();
|
||||
traversal(root);
|
||||
if (vec.size() < 2) return 0;
|
||||
int result = INT_MAX;
|
||||
for (int i = 1; i < vec.size(); i++) { // 统计有序数组的最小差值
|
||||
result = min(result, vec[i] - vec[i-1]);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
以上代码是把二叉搜索树转化为有序数组了,其实在二叉搜素树中序遍历的过程中,我们就可以直接计算了。
|
||||
|
||||
需要用一个pre节点记录一下,当前节点的前一个节点。
|
||||
|
||||
如图:
|
||||
|
||||
<img src='../pics/530.二叉搜索树的最小绝对差.png' width=600> </img></div>
|
||||
|
||||
代码如下:
|
||||
|
||||
```
|
||||
class Solution {
|
||||
private:
|
||||
int result = INT_MAX;
|
||||
TreeNode* pre;
|
||||
void traversal(TreeNode* cur) {
|
||||
if (cur == NULL) return;
|
||||
traversal(cur->left);
|
||||
if (pre != NULL){
|
||||
result = min(result, cur->val - pre->val);
|
||||
}
|
||||
pre = cur; // 记录前一个
|
||||
traversal(cur->right);
|
||||
}
|
||||
public:
|
||||
int getMinimumDifference(TreeNode* root) {
|
||||
traversal(root);
|
||||
return result;
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
### 迭代
|
||||
|
||||
看过这两篇[二叉树:听说递归能做的,栈也能做!](https://mp.weixin.qq.com/s/c_zCrGHIVlBjUH_hJtghCg),[二叉树:前中后序迭代方式的写法就不能统一一下么?](https://mp.weixin.qq.com/s/WKg0Ty1_3SZkztpHubZPRg)文章之后,不难写出两种中序遍历的迭代法。
|
||||
|
||||
下面我给出其中的一种,代码如下:
|
||||
|
||||
```
|
||||
class Solution {
|
||||
public:
|
||||
int getMinimumDifference(TreeNode* root) {
|
||||
stack<TreeNode*> st;
|
||||
TreeNode* cur = root;
|
||||
TreeNode* pre = NULL;
|
||||
int result = INT_MAX;
|
||||
while (cur != NULL || !st.empty()) {
|
||||
if (cur != NULL) { // 指针来访问节点,访问到最底层
|
||||
st.push(cur); // 将访问的节点放进栈
|
||||
cur = cur->left; // 左
|
||||
} else {
|
||||
cur = st.top();
|
||||
st.pop();
|
||||
if (pre != NULL) {
|
||||
result = min(result, cur->val - pre->val); // 中
|
||||
}
|
||||
pre = cur;
|
||||
cur = cur->right; // 右
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
};
|
||||
```
|
||||
Reference in New Issue
Block a user