题目标题: 二叉搜索树最小差值(算法2阳慧) 题目描述: 给定一棵二叉搜索树,请你返回树中任意两节点之差的最小值。 数据范围:二叉树节点数满足 2≤n≤10 5 ,二叉树的节点值满足 0≤val≤10 9 ,保证每个节点的值都不同 输入描述: 输入一棵二叉搜索树的扩展前序遍历序列。 输出描述描述: 返回树中任意两节点之差的最小值。 样式输入: 2,1,3,#,#,#,4 样式输出: 1
时间: 2024-01-18 07:03:11 浏览: 141
LeetCode5. 最长回文子串(双指针、中心扩展算法)
算法思路:
对于二叉搜索树,中序遍历的结果是一个升序序列。因此,我们可以通过中序遍历得到排序后的节点值数组,然后遍历数组,依次计算相邻两个节点值之差的绝对值,找到其中的最小值即可。
C++ 代码实现:
```c++
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
void preOrder(TreeNode* root, vector<int>& nums) {
if (root == NULL) return;
nums.push_back(root->val);
preOrder(root->left, nums);
preOrder(root->right, nums);
}
int getMinimumDifference(TreeNode* root) {
vector<int> nums;
preOrder(root, nums);
sort(nums.begin(), nums.end());
int minDiff = INT_MAX;
for (int i = 1; i < nums.size(); i++) {
int diff = nums[i] - nums[i - 1];
if (diff < minDiff) {
minDiff = diff;
}
}
return minDiff;
}
int main() {
string input;
getline(cin, input);
input.erase(remove(input.begin(), input.end(), ','), input.end());
TreeNode* root = NULL;
if (input != "#") {
root = new TreeNode(stoi(input));
}
TreeNode* cur = root;
for (int i = 1; i < input.size(); i++) {
if (input[i] == '#') {
if (cur == root) {
break;
}
cur = cur->right;
} else {
int j = i;
while (j < input.size() && input[j] != '#') {
j++;
}
int val = stoi(input.substr(i, j - i));
if (cur->left == NULL) {
cur->left = new TreeNode(val);
cur = cur->left;
} else {
cur->right = new TreeNode(val);
cur = cur->right;
}
i = j;
}
}
int ans = getMinimumDifference(root);
cout << ans << endl;
return 0;
}
```
阅读全文