题目要求:
整体思路一
1、千万要记住:读题!读题!读题!,博主一开始的时候,没仔细看,没看到他说的是二叉搜索树,没用上搜索树性质,硬做。
2、硬做思路很简单,因为求的是树上任意两个点差的绝对值最小,所以就递归嵌套递归即可,将每个节点和他的全部子节点做个差就行,找最小的。
3、缺点显而易见,递归层数太多,时间消耗太大,一旦数据量大了比完蛋。
具体代码一
class Solution {
public:
int ans = 1 << 30;
int getMinimumDifference(TreeNode* root) {
Sub_Main(root);
return ans;
}
void Sub_Main(TreeNode* root) {
if (root == nullptr) {
return;
}
Sub(root->left, root->val);//记录root的val,将之与左右子树做差,找最小的
Sub(root->right, root->val);
Sub_Main(root->left);//这个节点完事,再找儿子节点。
Sub_Main(root->right);
}
void Sub(TreeNode* root, int val) {
if (root == nullptr) {
return;
}
int subing = abs(root->val - val);//做差,动态找最小。
ans = min(ans, subing);
Sub(root->left, val);
Sub(root->right, val);
}
};
(所有代码均已在力扣上运行无误)
经测试,该代码运行情况是(经过多次测试所得最短时间):
整体思路二
1、在一个升序排列的数组,任意两个数差的绝对值最小,那么那两个数必相邻,因为升序排列的缘故。
2、有上述知识,再加之二叉搜索树本身特殊的性质-即中序遍历得到递增序列,所以就在递增序列所有相邻的数之间做差找最小值。
具体代码二
class Solution {
public:
int ans = 1 << 30;
int pre = -1;//记录前序数字,方便动态查找
int getMinimumDifference(TreeNode* root) {
dfs(root);
return ans;
}
void dfs(TreeNode* root) {
if (root == nullptr) {
return;
}
dfs(root->left);
if (pre == -1) {
pre = root->val;
}
else {
ans = min(ans, abs(pre - root->val));
pre = root->val;
}
dfs(root->right);
}
};
(所有代码均已在力扣上运行无误)
经测试,该代码运行情况是(经过多次测试所得最短时间):