数据结构与算法--力扣109题将有序双向链表转换为二叉搜索树

将有序数组转换为二叉搜索树
  • 近一年都比较关注算法相关的知识,也刷了不少题,之前的文章中大多也是算法相关的文章,但是感觉每次遇到树相关的题型都不能应对自如,因此还是有必要在相关知识上下功夫,因此有此次总结,以下是所有树相关的文章

数据结构与算法–面试必问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分别求中间节点并且构建对应的树节点,依次递归每个左右子树
算法实现
/**
 * @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题将有序数组转换为二叉搜索树

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值