LeetCode Minimum Distance Between BST Nodes(BST结点间最小差值)

       关于二叉树的问题确实很多,诸如路径、距离与修改结点值等,前两天做了这样一个题目,觉着延伸性很大,所以和大家分享一下,首先我们来看到一些题目~

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树呢,怎么求任意两节点的最小差值,很简单的思想就是把树遍历一遍,然后将所有结点值添加到一个集合中,然后通过集合类对集合进行排序即可求得最小差值,然而这同样会创建另外一个集合空间,如果题目不允许我们创建其他空间呢,这个问题我留给大家思考吧,在以后的博文中我的实现会分享给大家,还是一句话,算法必须要通过不断地思考和练习,只有这样我们才能得到乃至最优的解决问题的办法~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值