题目:
给你一个二叉搜索树的根节点 root
,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
解法一(二叉树遍历+排序+循环访问):
先进行二叉树的遍历将所有节点的值保存在一个数组中再进行遍历求解,包括使用递归函数、栈等数据结构的方式遍历,可以选择自己擅长的来实现,笔者通过递归函数实现二叉树的前序遍历。之后,再使用for一次循环遍历保存的所有数组计算二叉树节点最小距离的计算。如下为笔者代码:
class Solution {
public:
//创建二叉树遍历的递归函数TreeNode1
int TreeNode1(TreeNode* root, vector<int> &nums){
if(root!=nullptr){
nums.push_back(root->val);
}
else{
return 0;
}
TreeNode1(root->left, nums);
TreeNode1(root->right, nums);
return 0;
}
int minDiffInBST(TreeNode* root) {
//创建保存二叉树节点的vector数组容器的数据结构
vector<int> nums;
TreeNode1(root,nums);
//将保存的数组结果进行从小到大顺序的排序
sort(nums.begin(),nums.end());
int length = nums.size();
int min = 1000000;
//for循环遍历计算两两数组中元素的最小距离差
for(int i=0;i<length-1;i++){
min = std::min(min, abs(nums[i]-nums[i+1]));
}
return min;
}
};
解法二(中序遍历):
本题要求二叉搜索树任意两节点差的最小值,而我们知道二叉搜索树有个性质为二叉搜索树中序遍历得到的值序列是递增有序的,因此我们只要得到中序遍历后的值序列即能用上文提及的方法来解决。二叉树的中序遍历有多种方式,包括递归、栈、Morris 遍历等,读者可选择自己最擅长的来实现。通过最普遍的递归方法来实现如下代码:
class Solution {
public:
void dfs(TreeNode* root, int& pre, int& ans) {
if (root == nullptr) {
return;
}
dfs(root->left, pre, ans);
if (pre == -1) {
pre = root->val;
} else {
ans = min(ans, root->val - pre);
pre = root->val;
}
dfs(root->right, pre, ans);
}
int minDiffInBST(TreeNode* root) {
int ans = INT_MAX, pre = -1;
dfs(root, pre, ans);
return ans;
}
};
笔者小记:
1、二叉树遍历可通过前序遍历,中序遍历,后序遍历等操作实现,通过栈、队列、递归函数等数据结构方式完成,在解决问题的同时,可多利用C++标准数据库中的函数简化代码量,例如sort()排序函数,min(),max()比较最大最小值计算函数,swap()交换数组函数等
2、二叉搜索树的性质中左子树节点值均小于根节点的值小于右节点的值,所有二叉树均满足这个性质,而普通二叉树没有这个性质。
3、二叉搜索树有个性质为二叉搜索树中序遍历得到的值序列是递增有序的