LeetCode 530 二叉搜索树的最小绝对差

1.二叉搜索树left<root<right;
2.二叉搜索树中序遍历为升序数组。
3.升序数组连续两个元素的差值最小。

  1. 中序遍历(递归)
  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的右节点为跟,开始新的轮回
	}
}
  1. 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;
    }
    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值