天天看點

leetcode.783. 二叉搜尋樹節點最小距離(minimum-distance-between-bst-nodes)783. 二叉搜尋樹節點最小距離思路與代碼

783. 二叉搜尋樹節點最小距離

給你一個二叉搜尋樹的根節點

root

,傳回 樹中任意兩不同節點值之間的最小內插補點 。

**注意:**本題與 530:https://leetcode-cn.com/problems/minimum-absolute-difference-in-bst/ 相同

示例 1:

leetcode.783. 二叉搜尋樹節點最小距離(minimum-distance-between-bst-nodes)783. 二叉搜尋樹節點最小距離思路與代碼
輸入:root = [4,2,6,1,3]
輸出:1
           

示例 2:

leetcode.783. 二叉搜尋樹節點最小距離(minimum-distance-between-bst-nodes)783. 二叉搜尋樹節點最小距離思路與代碼
輸入:root = [1,0,48,null,null,12,49]
輸出:1
           

提示:

  • 樹中節點數目在範圍

    [2, 100]

  • 0 <=

    Node.val

    <= 1 0 5 10^{5} 105

思路與代碼

如果一個數組是升序的,求它們兩任意兩個元素的最小值,答案一定為相鄰兩個元素之差的最小值 .看下圖,

數組是升序的,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. 二叉樹的中序周遊的官方題解」,這裡不再贅述。