给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。
示例 1:
输入:root = [4,2,6,1,3]输出:1
示例 2:
输入:root = [1,0,48,null,null,12,49]输出:1
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
题解1:四不像
二叉树几种遍历方式的特点都已经忘干净了,也没有想到中序遍历实际上就是从小到大把搜索树上的元素依次过一遍。用了返回值的方式,每次将结点最左边的子孙和最右边的子孙返回给父节点,这样一来父节点就可以得知左边的数和右边的数是几了。但实际上没必要这么麻烦。
class Solution {int min=1000000;int current;public int minDiffInBST(TreeNode root) {get(root);return min;}public int[] get(TreeNode node){int [] res = new int[2];int [] left=null, right=null;if(node.left!=null){left = get(node.left);min = Math.min(node.val-left[1], min);}if(node.right!=null){right = get(node.right);min = Math.min(right[0]-node.val, min);}if(left!=null)res[0] = left[0];elseres[0] = node.val;if(right!=null)res[1] = right[1];elseres[1] = node.val;return res;}}
题解2:中序遍历
class Solution {
int pre;
int ans;
public int minDiffInBST(TreeNode root) {
ans = Integer.MAX_VALUE;
pre = -1;
dfs(root);
return ans;
}
public void dfs(TreeNode root) {
if (root == null) {
return;
}
dfs(root.left);
if (pre == -1) {
pre = root.val;
} else {
ans = Math.min(ans, root.val - pre);
pre = root.val;
}
dfs(root.right);
}
}
