783. 二叉搜尋樹節點最小距離
給你一個二叉搜尋樹的根節點
root
,傳回 樹中任意兩不同節點值之間的最小內插補點 。
**注意:**本題與 530:https://leetcode-cn.com/problems/minimum-absolute-difference-in-bst/ 相同
示例 1:

輸入:root = [4,2,6,1,3]
輸出:1
示例 2:
輸入:root = [1,0,48,null,null,12,49]
輸出:1
提示:
- 樹中節點數目在範圍
内[2, 100]
- 0 <=
<= 1 0 5 10^{5} 105Node.val
思路與代碼
如果一個數組是升序的,求它們兩任意兩個元素的最小值,答案一定為相鄰兩個元素之差的最小值 .看下圖,
數組是升序的,11減去2得到的差為9,肯定沒有7送去2得到的差5小。
2 | 7 | 11 |
---|---|---|
5 | 4 |
因為二叉搜尋樹中序周遊得到的值序列是遞增有序的,是以可以用中序周遊來解決本題。
#include <iostream>
#include <vector>
using namespace std;
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) {}
};
class Solution {
private:
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);
}
public:
int minDiffInBST(TreeNode* root) {
int ans = INT_MAX, pre = -1;
dfs(root, pre, ans);
return ans;
}
};
int main()
{
TreeNode t4(4);
TreeNode t2(2);
TreeNode t6(6);
TreeNode t1(1);
TreeNode t3(3);
t4.left = &t2;
t4.right = &t6;
t2.left = &t1;
t2.right = &t3;
Solution s;
cout << s.minDiffInBST(&t4) << endl;
}
二叉樹的中序周遊有多種方式,包括遞歸、棧、Morris 周遊等,讀者可選擇自己最擅長的來實作。下文代碼提供最普遍的遞歸方法來實作,其他周遊方法的介紹可以詳細看「94. 二叉樹的中序周遊的官方題解」,這裡不再贅述。