Leetcode530
1.问题描述
2.解决方案
二叉树问题总结:
1.遇到二叉搜索树上求最值差值之类的,就等价于在一个有序数组上求最值差值,这样问题就简单多了!!
2.要学会在递归过程中记录前一个结点preNode,学会了发现真的很实用
解法一:中序遍历
思路很直接就是把中序找出来,遍历一遍!
class Solution {
public:
vector<int> inorder;
void tran(TreeNode* root){
if(root== nullptr) return;
tran(root->left);
inorder.push_back(root->val);
tran(root->right);
}
int getMinimumDifference(TreeNode* root) {
tran(root);
int mini=INT32_MAX;
for(int i=1;i<inorder.size();i++){
if(inorder[i]-inorder[i-1]<mini) mini=inorder[i]-inorder[i-1];
}
return mini;
}
};
解法二:中序遍历递归
思路很好就是在中序递归的过程中就加以判断
一个重点来了!!!!
1.需要使用一个preNode来记录前一个结点,这三条语句实现了这一逻辑!!!
2.只有preNode!=nullpter才判断当前结点和preNode的差值其实就是因为preNode初始化为nullptr
3.然后每次都要记录preNode=root
TreeNode* preNode= nullptr;
if(preNode!= nullptr&&root->val-preNode->val<mini) mini=root->val-preNode->val;
preNode=root;
class Solution {
public:
int mini=INT32_MAX;
TreeNode* preNode= nullptr;
int getMinimumDifference(TreeNode* root) {
if(root== nullptr) return 0;
getMinimumDifference(root->left);
if(preNode!= nullptr&&root->val-preNode->val<mini) mini=root->val-preNode->val;
preNode=root;
getMinimumDifference(root->right);
return mini;
}
};
解法三:迭代
同样都有使用统一迭代法来模拟中序遍历,我还没看,暂时不给出了