将链表转换为树

题目来源

今天做了个题:

将一个链表里的数据组装树形结构,链表里的数据已经满足树形结构要求

这道题描述的很简单,但是有很多种情况。他只说了链表数据满足树形结构要求,并没有说明数据到底是什么样的,也就是题目参数具有多样性,这样其实我们给出一种解决方案就可以。而且也只要求将链表转换为树,并没有说是什么树。所以这道题说难也难,说简单也简单。

解题思路

最近也将平衡二叉树的原理看了一下,正好借着这道题将代码手写一下。

我写了一个平衡二叉树的插入方法。我们不管链表里面的数据是如何排序的,我们只要调用树的插入方法即可。在插入方法内部实现树的平衡。

所以我们这道题也就转换成了手写平衡二叉树的插入过程。

代码实现

平衡二叉树

首先我们需要定义平衡二叉树的数据结构,在这里我们就用 int 类型来简单实现。

/**
 * 二叉平衡树的数据类型
 */
class AVLTreeNode {
    
    int val;
    int height = -1;
    AVLTreeNode left;
    AVLTreeNode right;

    public AVLTreeNode() {
    }

    public AVLTreeNode(int val) {
        this.val = val;
    }

}

接下来我们定义这个平衡二叉树中所需用到的方法:

class AVLTree {
    //定义一个变量,存储头部节点
    AVLTreeNode head;
    
    //我们在进行平衡判断时,需要知道每个节点的高度,从而进行计算
    private static int Height(AVLTreeNode avlTreeNode) {
        if (avlTreeNode == null) {
            return -1;
        } else {
            return avlTreeNode.height;
        }
    }

    //定义公共方法,实现内部封装
    public AVLTreeNode add(int value) {
        head = insert(head, value);
        return head;
    }
    //实际插入的方法
    private AVLTreeNode insert(AVLTreeNode root, int val) {
       ...
       ...
    }
    
}

我们知道,在平衡二叉树中,有四种调整情况。分别为 LL型,LR 型,RL 型,RR 型。

所以需要将这四个方法提前写明:

/*四种类型转换*/

public AVLTreeNode LL(AVLTreeNode node) {
    //反转结构
    AVLTreeNode result = node.left;
    node.left = result.ri
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值