关于二叉树的问题确实很多,诸如路径、距离与修改结点值等,前两天做了这样一个题目,觉着延伸性很大,所以和大家分享一下,首先我们来看到一些题目~
Given a Binary Search Tree (BST) with the root node root
, return the minimum difference between the values of any two different nodes in the tree.
Example :
Input: root = [4,2,6,1,3,null,null] Output: 1 Explanation: Note that root is a TreeNode object, not an array. The given tree [4,2,6,1,3,null,null] is represented by the following diagram: 4 / \ 2 6 / \ 1 3 while the minimum difference in this tree is 1, it occurs between node 1 and node 2, also between node 3 and node 2.
当我们入手这道题目的时候,我们应该会注意到用括号括着的BST,也正是因为它是一颗二叉树,使得我们的算法实现起来会简单很多,当我们对树进行中序遍历然后添加到一个数组或链表中,则会得到一个有序数组或有序链表,然后迭代遍历链表或数组求最小差值即可,代码如下:
List<Integer> list = new ArrayList<Integer>();
Intger min = Integer.MAX_VALUE;
public int minDiffInBST(TreeNode root) {
inOrder(root);
for (int i = 1; i < list.size(); ++i) {
int diff = list.get(i) - vis.get(i - 1);
min = Math.min(min, diff);
}
return min;
}
public void inOrder(TreeNode root) {
if (root == null) return;
inOrder(root.left);
list.add(root.val);
inOrder(root.right);
}
很显然,这种算法需要另外创建一个数组或链表,如果树比较大则会有比较大的空间开销,那么有没有O(1)空间复杂度的算法呢,一般情况下怎样的一种思想或者算法可以在O(1)空间复杂度的情况下实现呢,当我们有了一定的算法思维练习后,这个问题或许并不难,递归——解决O(1)空间复杂度问题的首个选择,那么尝试一下吧,哦,果然可以的~
int min = Integer.MAX_VALUE;
Integer prev = null;
public int getMinimumDifference(TreeNode root) {
if (root == null) return min;
getMinimumDifference(root.left);
if (prev != null) {
min = Math.min(min, root.val - prev);
}
prev = root.val;
getMinimumDifference(root.right);
return min;
}
我们通过递归中序遍历实现了题目要求,因此我们也有了另外一种实现方案,当通过深度优先搜索遍历可以实现的同时栈必然也是可以的,下面是我通过栈实现的代码~
public int minDiffInBST2(TreeNode root) {
int min = Integer.MAX_VALUE;
Stack<TreeNode> s = new Stack<TreeNode>();
Integer prev = null;
while (root != null || !s.isEmpty()) {
while (root != null) {
s.push(root);
root = root.left;
}
TreeNode n = s.pop();
min = prev == null ? min : Math.min( n.val - prev, min);
prev = n.val;
root = n.right;
}
return min;
}
上面的情况都是建立在BST树上的,如果是非BST树呢,怎么求任意两节点的最小差值,很简单的思想就是把树遍历一遍,然后将所有结点值添加到一个集合中,然后通过集合类对集合进行排序即可求得最小差值,然而这同样会创建另外一个集合空间,如果题目不允许我们创建其他空间呢,这个问题我留给大家思考吧,在以后的博文中我的实现会分享给大家,还是一句话,算法必须要通过不断地思考和练习,只有这样我们才能得到乃至最优的解决问题的办法~