1.二叉搜索树left<root<right;
2.二叉搜索树中序遍历为升序数组。
3.升序数组连续两个元素的差值最小。
- 中序遍历(递归)
void inorderTraversal(TreeNode* root, vector<int> &res){ //使用引用传递
if(!root) return;
inorderTraversal(root->left);
res.emplace_back(root->val);
traversal(root->right);
return;
}
中序遍历(非递归)
//left --> root --> right
//每到一个节点 A,因为根的访问在中间,先将 A 入栈。然后遍历左子树,接着访问 A,最后遍历右子树。 在访问完 A 后,A 就可以出栈了。因为 A 和其左子树都已经访问完成。
void inorderTraversal(TreeNode* root, vector<int> &res){
stack<TreeNode* > S;
while(root || S.size())
{
while(root)
{
S.push(root)); //将A入栈
root = root->left; //遍历左子树
}
root = S.top(); //弹出节点A
S.pop(); //在访问完 A 后,A 就可以出栈了
res.emplace_back(root->val); //保存节点A的值
root = root->right; //以A的右节点为跟,开始新的轮回
}
}
- res为升序数组,求连续两个元素的差值最小。
int getMinimumDifference(TreeNode* root){
if(!root) return -1;
int minnum = INT_MAX;
vector<int>res;
inorderTraversal(root,res);
for(int i=1; i<res.size(); i++)
{
cout<<res[i-1]<<endl;
minnum = min(minnum, res[i] - res[i-1]);
}
return minnum;
}
3.在二叉树遍历的同时计算差值
//需要保存前一个节点
int getMinimumDifference(TreeNode* root){
TreeNode* prev = nullptr;
stack<TreeNode*> S;
minval = INT_MAX;
while(root || S.size())
{
//遍历左子树,把root压栈
while(root)
{
S.push(root);
root = root->left;
}
root = S.top();
S.pop();
//计算差值
if(pre)
{
minval = min(minval, root->val - pre->val);
}
//pre后移
pre = root;
root = root->right;
}
}