Description
Given a binary search tree with non-negative values, find the minimum absolute difference between values of any two nodes.
Example
Input:
1
\
3
/
2
Output:
1
Explanation:
The minimum absolute difference is 1, which is the difference between 2 and 1 (or between 2 and 3).
Note
There are at least two nodes in this BST.
Solution 1(C++)
class Solution {
public:
void TraverseTree(TreeNode* node, int &prev, int &res){
if(!node) return;
TraverseTree(node->left,prev,res);
if(prev!=-1) res=min(res,node->val-prev);
prev=node->val;
TraverseTree(node->right,prev,res);
}
int getMinimumDifference(TreeNode* root) {
int res=INT_MAX, prev=-1;
TraverseTree(root,prev,res);
return res;
}
};
算法分析
我之前写的使用了vecotr来按照前序遍历的方法遍历BST的,但是还是要学会不适用额外的储存空间应该如何解决问题。那么这道题就是很经典的前序遍历了。
程序分析
前序遍历的基本套路我已经熟悉了,那么中序,后序如法炮制。但是要注意的是,不适用额外的储存空间,如何传递之前的节点值。其实解法一可以分为三步走。
- 前序遍历:先向左走
- 回到中间,如果pre不是-1,就可以对res更新;如果pre是-1,那么就不更新res。走到node,都要将node更新为pre
- 前序遍历:最后向右走
其实这里的道理不难懂。前序遍历无非就是:左 - > 中 - > 右。 一直往左的时候,pre没有办法更新,自然就是设定的初始值-1。当左边走完了,就自然回到了中,下一步就是右了,那么在右之前,中就应该成为了pre。