![c2eb45b12dc417067d58a2f28126a553.png](https://img-blog.csdnimg.cn/img_convert/c2eb45b12dc417067d58a2f28126a553.png)
技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后到中级难度,最后到hard难度全部完。目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和精力有限,其他语言的实现有兴趣的朋友请自己尝试。初级难度说的差不多的时候,我打算再加点其他内容,我可能会从操作系统到协议栈,从分布式聊到大数据框架,从大数据聊到人工智能,... ...。 如果有任何问题可以在文章后评论或者私信给我。 我会持续分享下去,敬请您的关注。
LeetCode 783. 求二叉搜索树结点最小距离(Minimum Distance Between BST Nodes)
问题描述:
给定一个二叉搜索树的根结点 root, 返回树中任意两节点的差的最小值。
注:
- 二叉树的大小范围在 2 到 100。
- 二叉树总是有效的,每个节点的值都是整数,且不重复。
示例:
![1ffa8a1dab3f559b9fe39762a89fdd25.png](https://img-blog.csdnimg.cn/img_convert/1ffa8a1dab3f559b9fe39762a89fdd25.png)
C语言实现:
思路,分类处理:
我们知道BST的特点是中序遍历后可以生成一个有序列表,那么所谓的节点最小距离就是这个有序列表中每相邻的两个节点差的最小值。
所以很自然,我们通过对BST的中序遍历就可以解决这个问题。
代码如下:
![bcda05b9c9e126dea1811a2495623176.png](https://img-blog.csdnimg.cn/img_convert/bcda05b9c9e126dea1811a2495623176.png)
这里需要理解遍历函数diff的后两个指针参数x和y的含义。
x是遍历过程中保持的前一个节点的值,我们以示例举例说明一下:
示例前序遍历的结果是[1,2,3,4,6],这个x在遍历的过程中依次就是1,2,3,4,6。
y是我们要返回的结果,这个很简单。
这两个参数在整个遍历的过程中不断更新的。
![bbdef9a5418adf34d6019366cbb0beb1.png](https://img-blog.csdnimg.cn/img_convert/bbdef9a5418adf34d6019366cbb0beb1.png)
python语言的实现:
python的实现和C语言的实现类似,由于我们传递给diff的参数在递归过程中要不断更新的,所以我们用一个数组来分别存放pre和min,最后返回arr[1]即min即可。
代码如下:
![86c1dcce9f0e8e47a3f635d2644fe005.png](https://img-blog.csdnimg.cn/img_convert/86c1dcce9f0e8e47a3f635d2644fe005.png)
![93fdad9cea4ab826303441bfc0a4a21c.png](https://img-blog.csdnimg.cn/img_convert/93fdad9cea4ab826303441bfc0a4a21c.png)
Java语言的实现:
Java的实现和C语言的实现原理基本相同。只不过省略了辅助函数,pre和min作为类属性,然后直接实现minDiffInBST方法,但是其实没什么区别。
代码如下:
![0ababb755a06af46d112c259ebf6e7bc.png](https://img-blog.csdnimg.cn/img_convert/0ababb755a06af46d112c259ebf6e7bc.png)
![c8bed89c6ef23109977699c7eb9190ee.png](https://img-blog.csdnimg.cn/img_convert/c8bed89c6ef23109977699c7eb9190ee.png)
。