题目描述
原题链接:530. 二叉搜索树的最小绝对差
解题思路
利用BST的特性,采用中序遍历的方式,可以得到单调递增的元素。
1、递归法(中序遍历)
/**
* 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) {}
* };
*/
class Solution {
public:
TreeNode* pre = NULL; // 指向前一个结点的指针
int res = 1e5; // 存储结果
int getMinimumDifference(TreeNode* root) {
if(!root) return 0;
getMinimumDifference(root->left); // 左
// 不为第一个结点并且当前结点减去头一个结点的值要比res中的更小,则更新
if(pre && root->val - pre->val < res) res = root->val - pre->val; // 中
pre = root; // pre指向当前结点,再去遍历下一个结点
getMinimumDifference(root->right); // 右
return res;
}
};
Python
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def __init__(self):
self.abs_value = 1e5 + 1
self.pre = None
def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
if not root:
return 0
self.getMinimumDifference(root.left)
if self.pre and abs(self.pre.val - root.val) < self.abs_value:
self.abs_value = abs(self.pre.val - root.val)
self.pre = root
self.getMinimumDifference(root.right)
return self.abs_value
2、迭代法
/**
* 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) {}
* };
*/
class Solution {
public:
int getMinimumDifference(TreeNode* root) {
stack<TreeNode*> st;
TreeNode* cur = root;
int res = 1e5;
TreeNode* pre = NULL;
while(cur || !st.empty()) {
while(cur) {
st.push(cur);
cur = cur->left;
}
cur = st.top(); st.pop();
// 中间结点进行处理
if(pre && cur->val - pre->val < res) res = cur->val - pre->val;
pre = cur;
cur = cur->right; // 下一次遍历向右子树遍历
}
return res;
}
};
Python
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
pre, cur = None, root
st = []
abs_value = 1e5 + 1
while cur or len(st) != 0:
while cur:
st.append(cur)
cur = cur.left
cur = st.pop()
if pre and abs(pre.val - cur.val) < abs_value:
abs_value = abs(pre.val - cur.val)
pre = cur
cur = cur.right
return abs_value