题目:
给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。
示例 1:

输入:root = [4,2,6,1,3]
输出:1
示例 2:

输入:root = [1,0,48,null,null,12,49]
输出:1
需要考虑到的测试用例:
- 功能测试:如 [4, 2, 6, 1, 3]
- 特殊输入测试:如树中只有单个节点、两个节点
- 性能测试:如树的节点个数较大
分析:
需要搜索到二叉树中所有节点元素,最小差值一定出现在数值差距最小的两个元素之间,因此可以把所有元素进行排序,再遍历及相邻元素差值,寻找最小值。所以问题的本质是二叉树中值遍历算法与排序算法的组合。
二叉树中值遍历算法有三种:递归、迭代、Morris中序遍历,前二者算法时间复杂度与空间复杂度均为O(n),Morris中序遍历时间复杂度为O(n),空间复杂度为O(1),当然选用Morris中序遍历。
基于以上分析,编写如下解法代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
int minDiffInBST(TreeNode* root) {
if (root == NULL) {
return -1;
}
vector<int> members = inOrderTracersal(root);
if (members.size() == 1) {
return 0;
}
sort(members.begin(), members.end());
int ret = members[1] - members[0];
for (unsigned int i = 1; i < members.size

本文介绍了如何在二叉搜索树中找到任意两个不同节点值之间的最小差值,主要讨论了三种遍历方法:递归、迭代和Morris中序遍历,并详细分析了每种方法的时间和空间复杂度。代码实现中,使用了Morris中序遍历以降低空间复杂度,最后给出了排序和找到最小差值的解决方案。
最低0.47元/天 解锁文章


被折叠的 条评论
为什么被折叠?



