题目来源
今天做了个题:
将一个链表里的数据组装树形结构,链表里的数据已经满足树形结构要求
这道题描述的很简单,但是有很多种情况。他只说了链表数据满足树形结构要求,并没有说明数据到底是什么样的,也就是题目参数具有多样性,这样其实我们给出一种解决方案就可以。而且也只要求将链表转换为树,并没有说是什么树。所以这道题说难也难,说简单也简单。
解题思路
最近也将平衡二叉树的原理看了一下,正好借着这道题将代码手写一下。
我写了一个平衡二叉树的插入方法。我们不管链表里面的数据是如何排序的,我们只要调用树的插入方法即可。在插入方法内部实现树的平衡。
所以我们这道题也就转换成了手写平衡二叉树的插入过程。
代码实现
平衡二叉树
首先我们需要定义平衡二叉树的数据结构,在这里我们就用 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