![bb6d40c59d49e715dcf59af2648b9e77.png](https://i-blog.csdnimg.cn/blog_migrate/83a038ed72c67b32831347a8497eeecf.jpeg)
技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后到中级难度,最后到hard难度全部完。
目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和精力有限,其他语言的实现有兴趣的朋友请自己尝试。
初级难度说的差不多的时候,我打算再加点其他内容,我可能会从操作系统到协议栈,从分布式聊到大数据框架,从大数据聊到人工智能,... ...。
如果有任何问题可以在文章后评论或者私信给我。
我会持续分享下去,敬请您的关注。
LeetCode 108. 将有序数组转换为一个平衡二叉搜索树(Convert Sorted Array to Binary Search Tree)
问题描述:
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
![1f591355e3ff23d1ded71ff046958960.png](https://i-blog.csdnimg.cn/blog_migrate/b0fc8282f4b3e57c66fb441514153a77.jpeg)
C语言实现:
将有序数组转换成一个平衡的二叉搜索树,意味着,这个二叉树,左边的节点数和右边的节点数相差不能大于1,否则可能就是不平衡的。(我说的是可能,在节点数很多的时候,这个结论是不成立的,但是不管怎么说满足这个条件的,一定是平衡的)
那么明显数组的最中间的节点“m”应该作为二叉树“T”的根节点,m的左边和右边的元素分别是二叉树“T”的左子树和右子树的节点。
同样的,对于“m”左边或右边的元素,依然需要选取一个大小居中的元素作为“T”的左子树或右子树的根节点,……。如此这样下去,最终就能形成一个新的平衡二叉搜索树。
在C的实现中,我们用指针来控制数组的访问非常方便。
这里需要提醒的是,当你通过指针改变数组的查找范围的时候,注意这个查找长度也同样需要更新。
代码如下:
![230fd2993f14c1093991d84b6736c68b.png](https://i-blog.csdnimg.cn/blog_migrate/6b90bfef296067d90b2db9c51443e829.jpeg)
![7e4d5791341729423223ce07458a327b.png](https://i-blog.csdnimg.cn/blog_migrate/7a34f8c9a65c8aebf24825b624226dd3.jpeg)
python语言的实现:
python的实现和C实现基本是一致的,只是对于python来说,用切片代替指针来控制数组的搜索范围。
代码如下:
![ece797888cbc7d0cacff5bea826bd5a0.png](https://i-blog.csdnimg.cn/blog_migrate/9d949fa6a024d1f919004131ba768bbc.jpeg)
![8eb3d4bc8f743989228bfe974348d20c.png](https://i-blog.csdnimg.cn/blog_migrate/aa0166ed2b622ca2bbe168319aade634.jpeg)
Java语言的实现:
Java没有C的指针,也没有python那样的切片工具,因此我们定义了一个函数来做这件事情,函数要包含两个整型参数作为搜索数组的起始和结束下标。
其他的部分和C语言的实现基本一致。
代码如下:
![d693bcc04f54ebfa7c29597305f08418.png](https://i-blog.csdnimg.cn/blog_migrate/e57ff5a9dc385f76d2df89d85fc85444.jpeg)
![b4e278c3a23ec2ac7a3e567269b65098.png](https://i-blog.csdnimg.cn/blog_migrate/94a16b5dd46b8b7cee160ed81c8a23ce.jpeg)