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

image

PS:(感觉这题名字和内容有歧义)

要求得到任意不同节点值之间的最小差值。

本身二叉树是有序的,又找最小差值,其实就是相当于在一个有序数组中找到每相邻两数之间最小差值。


朴素思想:

中序遍历树,把值都塞到数组里,然后遍历数组,得到最小差值。

改良:

中序遍历树时,依次得到的数已经是有序的,只需在遍历树的时候就更新最小差值即可。

class Solution {
    int mins = INT_MAX;
    TreeNode* prev = nullptr;//记录上一个节点
    void dfs(TreeNode* root)
    {
        if(!root) return;
        dfs(root->left);//左节点
        if(prev)//处理
        {
            mins = min(mins,abs(prev->val - root->val));
        }
        prev = root;//更新上一个节点为当前节点
        dfs(root->right);//右节点
    }
public:
    int minDiffInBST(TreeNode* root) {
        dfs(root);
        return mins;
    }
};

关于树的遍历:

树有前、中、后三种遍历顺序,其中前、中、后均是指处理根节点的顺序。

任何一种遍历顺序,大多情况下,只需思考处理根节点时的逻辑,区别仅在于,根节点的逻辑是放在左节点递归、右节点递归的何处,再最后补上临界就OK。

另外,此题提醒了我,树的中序遍历会保留顺序!

posted @ 2021-04-13 11:16  抚琴思伯牙  阅读(71)  评论(0编辑  收藏  举报