将有序数组转换为二叉搜索树
- 近一年都比较关注算法相关的知识,也刷了不少题,之前的文章中大多也是算法相关的文章,但是感觉每次遇到树相关的题型都不能应对自如,因此还是有必要在相关知识上下功夫,因此有此次总结,以下是所有树相关的文章
数据结构与算法–面试必问AVL树原理及实现
数据结构与算法–二叉树的深度问题
数据结构与算法–二叉堆(最大堆,最小堆)实现及原理
数据结构与算法–二叉查找树转顺序排列双向链表
数据结构与算法-- 二叉树中和为某一值的路径
数据结构与算法-- 二叉树后续遍历序列校验
数据结构与算法-- 广度优先打印二叉树
数据结构与算法–解决问题的方法- 二叉树的的镜像
数据结构与算法–重建二叉树
数据结构与算法–二叉查找树实现原理
数据结构与算法–二叉树实现原理
数据结构与算法–B树原理及实现
数据结构与算法–数字在排序数组中出现次数
数据结构与算法–死磕二叉树
数据结构与算法–二叉树第k个大的节点
数据结构与算法–力扣108提将有序数组转换为二叉搜索树
原题
- 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
- 通上一篇中一样,平衡二叉树,高度差不超过1,其实就是AVL树
分析
- AVL(Adelson-Velskii 和landis)树是带有平衡条件的二叉查找树,这个平衡条件必须容易实现,并且保证树的深度必须是O(logN)。因此我们让一棵AVL树中每个节点的左子树和右子树的高度最多相差1(空树高度定义-1)如下图,左边是AVL树,右边不是AVL树。
- 对AVl树的构建实现以及原理在之前的文章 数据结构与算法–面试必问AVL树原理及实现 有做详细的分析
- 算法分析:
- 同上篇中思路,因为是顺序链表,并且要求平衡二叉树,那么左右节点数一样,链表中间节点middle就是树的根
- head节点到middle是leftTree, middle节点到Tail是rightTree
- 同样对于左子树,右子树,也依据第一步骤中,取中间节点作为根,分别得出对应的树结构
- 如上,中间节点查找我们可以用快慢指针,fast每次2步,slow每次一步,得到的slow就是中间节点
- 首先我们对head~ ail(此时tail可以用null代替,最后节点就是null节点),得到中间节点slow,并且构建根slowNode
- 接着我们分别对head ~ slow ,slow.next ~ tail分别求中间节点并且构建对应的树节点,依次递归每个左右子树
算法实现
- 实现中所有的链表节点ListNode, 树节点BinaryNode的实现均出自自己的算法实现在之前的文章中有详细的实现分析。
/*** @author liaojiamin* @Date:Created in 14:31 2022/2/22*/
public class ConverListToBinary {public static void main(String[] args) {ListNode listNode = new ListNode("i", 1);for (int i = 6; i < 26; i++) {MyLinkedList.addToTail(listNode, i + "_"+ i, i);}ListNode head = listNode;ListNode headNext = listNode.getNext();while (headNext != null){headNext.setBefore(head);head = headNext;headNext = headNext.getNext();}BinaryNode binaryNode = buildTree(listNode, null);BinarySearchTree binarySearchTree = new BinarySearchTree();binarySearchTree.printTree(binaryNode);}public static BinaryNode buildTree(ListNode listNode, ListNode tail){if(listNode == tail){return null;}ListNode slow = listNode;ListNode fast = listNode;while (fast != tail && fast.getNext() != tail){fast = fast.getNext().getNext();slow = slow.getNext();}BinaryNode binaryNode = new BinaryNode(slow.getValue(), null, null);binaryNode.setLeft(buildTree(listNode, slow));binaryNode.setRight(buildTree(slow.getNext(), tail));return binaryNode;}
}
上一篇:数据结构与算法–力扣108题将有序数组转换为二叉搜索树