这篇page是针对leetcode上的530.二叉搜索树的最小绝对差所写的。小尼先简单的给大家说明一下这道题的意思,给出一个二叉搜索树的根节点root,返回树中任意两个不同节点之间的最小差值。
这边小尼先给出迭代法的解法:
class Solution { TreeNode pre; Stack<TreeNode> stack; public int getMinimumDifference(TreeNode root) { if(root == null){ return 0;} stack = new Stack<>(); TreeNode cur = root; int result = Integer.MAX_VALUE; while(cur != null || !stack.isEmpty()){ if(cur != null){ stack.push(cur); cur = cur.left; }else{ cur = stack.pop(); if(pre != null){ result = Math.min(result,cur.val - pre.val); } pre = cur; cur = cur.right; } } return result; } }
这边采用的方法就是我们先遍历到左子树的最左边的元素,然后我们再采取压栈出栈的操作对栈内的元素进行对应的操作,这里买呢定义了两个指针,一个pre和一个cur,我们的cur先到达最左边的元素,然后我们的pre再记录上一个元素,小尼觉得这道题最巧妙的就是我们的cur的跳转,在这里我们的cur=stack.pop(),这一句话可以使得cur的值可以有一个上跳的结果。
接下来小尼也给出递归的方法:
class Solution { TreeNode pre; int result = Integer.MAX_VALUE; public int getMinimumDifference(TreeNode root) { if(root == null) return 0; traversal(root); return result; } public void traversal(TreeNode root){ if(root == null) return; traversal(root.left); if(pre != null){ result = Math.min(result,root.val - pre.val); } pre = root; traversal(root.right); } }
这边就是满足递归三要素,传入参数、终止条件、每个递归执行的顺序