给定一个二叉搜索树的根结点 root, 返回树中任意两节点的差的最小值。
示例:
输入: root = [4,2,6,1,3,null,null]
输出: 1
解释:
注意,root是树结点对象(TreeNode object),而不是数组。
给定的树 [4,2,6,1,3,null,null] 可表示为下图:
4 / 2 6 / 1 3
最小的差值是 1, 它是节点1和节点2的差值, 也是节点3和节点2的差值。
注意:
二叉树的大小范围在 2 到 100。
二叉树总是有效的,每个节点的值都是整数,且不重复。
思路:中序遍历,因为搜索二叉树中序遍历后是升序的,所以最小差值一定存在于中序中相邻的结点之间;刚开始我用的后序遍历,当访问到根结点是此时计算根结点与左右子树结点的差值,此时会出现一个问题,比如:最小的差值不存在于任意结点与其左右子树之间,而是存在于根结点与左子树的最右结点之间(或根结点与其右子树的最左结点之间),此时无法正确的得出结果。
code1:中序遍历时把结点加入vector中,然后找出数组中相邻结点的最小差值
code2:中序遍历,边遍历,边求解
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { private: void minDiffInBSTCore(TreeNode* node,int &resMin,int &preVal) { if(!node) return ; minDiffInBSTCore(node->left,resMin,preVal); if(preVal>0) resMin=min(resMin,node->val-preVal); preVal=node->val; minDiffInBSTCore(node->right,resMin,preVal); return ; } public: int minDiffInBST(TreeNode* root) { if(!root) return 0; int resMin=INT_MAX; int preVal=-1; minDiffInBSTCore(root,resMin,preVal); return resMin; } };