题目:
给你一个二叉搜索树的根节点 root
,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
思路:中序遍历二叉搜索树的顺序是递增序列,将该序列中的相邻值两两比较找到最小差值。
递归代码:
int min=Integer.MAX_VALUE;TreeNode pre;//记录上一个遍历的节点public int getMinimumDifference(TreeNode root) {traversal(root);return min;}public void traversal(TreeNode root){if(root==null) return;traversal(root.left);//遍历左子树if(pre!=null)min=Math.min(min,root.val-pre.val);//处理中节点,更新min值pre=root;//更新pretraversal(root.right);//处理右子树}
迭代代码:
public int getMinimumDifference(TreeNode root) {Stack<TreeNode> stack=new Stack<>();TreeNode pre=null;int min=Integer.MAX_VALUE;if(root!=null)stack.add(root);while(!stack.isEmpty()){TreeNode node=stack.peek();if(node!=null){stack.pop();if(node.right!=null) stack.add(node.right);stack.add(node);stack.add(null);//标记node已访问未处理if(node.left!=null) stack.add(node.left);}else{stack.pop();//弹出null节点TreeNode tmp=stack.pop();if(pre!=null)min=Math.min(min,tmp.val-pre.val);pre=tmp;}}return min;}