力扣 783. 二叉搜索树节点最小距离---二叉搜索树的中序遍历法

783. 二叉搜索树节点最小距离

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。

注意:本题与 530:https://leetcode-cn.com/problems/minimum-absolute-difference-in-bst/ 相同

示例 1:

力扣 783. 二叉搜索树节点最小距离---二叉搜索树的中序遍历法_第1张图片

输入:root = [4,2,6,1,3]
输出:1
示例 2:

力扣 783. 二叉搜索树节点最小距离---二叉搜索树的中序遍历法_第2张图片

输入:root = [1,0,48,null,null,12,49]
输出:1
 

提示:

树中节点数目在范围 [2, 100] 内
0 <= Node.val <= 105

题解:

首先我们知道对升序数组 求任意两个元素之差的最小值,答案一定为相邻两个元素之差的最小值。
而对于本题,它要求二叉搜索树任意两节点差的最小值,而我们知道二叉搜索树有个性质为二叉搜索树中序遍历得到的值序列是递增有序的,因此我们只要得到中序遍历后的值序列即能用上文提及的方法来解决。

首先我们需要了解什么是二叉树的中序遍历呢?

按照访问左子树——根节点——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵树。

通俗来说就是:
直观来看,二叉树的中序遍历就是将节点投影到一条水平的坐标上,根据其出现的先后顺序进行同样顺序的遍历。
如图:
力扣 783. 二叉搜索树节点最小距离---二叉搜索树的中序遍历法_第3张图片
按照此方法即可完成所求。

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

void dfs(struct TreeNode* root,int*temp,int*res)
{
    if(root==NULL)
        return;//此时表示结束不进行下面的操作了,不能用continue,因为continue只是对循环才可以用
    dfs(root->left,temp,res);//此设置dfs可以“一搜到底”,即会一直搜索到最后一个二叉树的左子树
    //所以由中序遍历的定义它也是开始搜索的第一个元素,即从最深处往上搜索
    if(*temp==INT_MIN)
    {
        *temp = root->val;
    }
    else
    {
        *res = fmin(*res,root->val-(*temp));
        *temp = root->val;
    }
    dfs(root->right,temp,res);
}

int minDiffInBST(struct TreeNode* root){
    int temp = INT_MIN;//保留此时指向的子树相对应的头部的val
    int res = INT_MAX;//保留结果
    dfs(root,&temp,&res);
    return res;
}

你可能感兴趣的:(Leetcode每日刷题,#,DFS与递归及回溯,#,树,二叉树,算法,dfs,c++)