版权声明:未经博主同意,禁止转载,联系方式qq2928013321 https://blog.csdn.net/weixin_42130471/article/details/82903302
题目描述:
给定一个二叉搜索树的根结点 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
。 - 二叉树总是有效的,每个节点的值都是整数,且不重复。
思路:中序遍历得到有序序列并保存到数组中,在求相邻两元素的最小值
代码一、递归方法
class Solution {
public int minDiffInBST(TreeNode root) {
// if(root==null)
// return 0;
vis=new ArrayList<Integer>();
dfs(root);
int min=Integer.MAX_VALUE;
for(int i=0;i<vis.size()-1;i++){
min=Math.min(min,vis.get(i+1)-vis.get(i));
}
return min;
}
List<Integer> vis;
public void dfs(TreeNode root){
if(root==null)
return ;
else{
dfs(root.left);
vis.add(root.val);
dfs(root.right);
}
}
}
代码二、非递归方法,也很简单,中序遍历非递归代码基本都有模版,只要记住入栈的顺序是和前序遍历结果是一样的,所以入栈的时候进行操作得到的就是前序遍历的结果。出栈的顺序和中序遍历的结果是一样的,所以在出栈的时候进行操作,这些操作得到的就是中序遍历的结果。刚开始初学前序遍历的时候无法理解,后来在看了别人的代码后自己手写模拟了几遍,终于搞懂了中序和前序遍历,还差后续遍历还没搞懂。
class Solution {
public int minDiffInBST(TreeNode root) {
List<Integer> vis=new ArrayList<Integer>();
Stack<TreeNode> stack=new Stack<>();
while(root!=null||!stack.empty()){
while(root!=null){
stack.push(root);
root=root.left;
}
if(!stack.empty()){
TreeNode t=stack.pop();
vis.add(t.val);
root=t.right;
}
}
int min=Integer.MAX_VALUE;
for(int i=0;i<vis.size()-1;i++){
min=Math.min(min,vis.get(i+1)-vis.get(i));
}
return min;
}
}