
思路:二叉搜索树,已经有序,将树放进数组中,然后进行比较,
cpp
class Solution {
public:
vector<int> vec;
void traversal(TreeNode*root)
{
if(root==nullptr) return;
traversal(root->left);
vec.push_back(root->val);
traversal(root->right);
}
int getMinimumDifference(TreeNode* root) {
//用一个vector存有序数组,进行临近比较;
traversal(root);
if(vec.size()<2) return 0;
int result = INT_MAX;
for(int i=1;i<vec.size();i++)
{
result=min(result,vec[i]-vec[i-1]);
}
return result;
}
};
思路:在中序遍历时,我们可以直接进行比较,只不过需要记录前一个节点
cpp
class Solution {
public:
int result=INT_MAX;
TreeNode*pre=NULL;
void traversal(TreeNode*root)
{
if(root==NULL) return;
traversal(root->left);//左
if(pre!=nullptr)
{
result=min(result,root->val-pre->val);//中
}
pre=root;
traversal(root->right);
}
int getMinimumDifference(TreeNode* root) {
//用一个vector存有序数组,进行临近比较;
traversal(root);
return result;
}
};
使用迭代法:用栈进行,记住前后的就行
cpp
class Solution {
public:
int getMinimumDifference(TreeNode* root) {
//使用栈进行遍历
stack<TreeNode*> st;
TreeNode*cur=root;
TreeNode*pre=nullptr;
int result=INT_MAX;
while(cur!=nullptr||!st.empty())
{
if(cur!=nullptr)//不为空入栈
{
st.push(cur);
cur=cur->left;
}
else//为空
{
cur=st.top();
st.pop();
if(pre!=nullptr)
{
result=min(result,cur->val-pre->val);
}
pre=cur;
cur=cur->right;
}
}
return result;
}
};