网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
AVL树的创建思路与算法步骤🐼
- 左旋思想与步骤
- 创建一个新的节点,其权值等于原根节点的权值
- 新节点的左子树等于原根节点的左子树
- 新节点的右子树等于原根结点的右子树的左子树
- 原根节点的权值等于其右子节点的权值
- 原根结点的右子树等于其右子树的右子树
- 原根结点的左子节点等于新节点
- 右旋思想与步骤
- 创建一个新的节点,其权值等于原根节点的权值
- 新节点的右子树等于原根结点的右子树
- 新节点的左子树等于原根结点的左子树的右子树
- 原根结点的权值等于其左子节点的权值
- 原根结点的左子树等于其左子树的左子树
- 原根结点的右子节点等于新节点
图解😶🌫️:
右旋
代码实现与分析🐼
节点类中🦁
1.右旋的核心代码🐻
public void rightRotation() {
var newNode = new Node(value);
newNode.right = right;
newNode.left = left.right;
value = left.value;
left = left.left;
right = newNode;
}
代码分析🐨:
略,按照算法步骤即可
2.左旋的核心代码🐻
public void leftRotation() {
var newNode = new Node(value);
newNode.left = left;
newNode.right = right.left;
value = right.value;
right = right.right;
left = newNode;
}
代码分析🐨:
略,根据算法步骤即可
3.判断树高的核心代码(最难)🐻
public int height() {
return Math.max(left != null ? left.height() : 0,right != null ? right.height() : 0) + 1;
}
代码分析🐨:
- 这里主要运用的思想是递归与回溯思想,利用递归,底层创建了许多的Math.max()
- 又根据谁调用,返回值给谁的原则,成就了该方法
- 以下是图解:
4.建立左高与右高的方法🐻
public int leftHeight() {
if (left == null) {
return 0;
}
return left.leftHeight();
}
public int rightHeight() {
if (right == null) {
return 0;
}
return right.rightHeight();
}
代码分析🐨:
- 最重要的就是校验是否为空,其他直接调取即可
5,创建一个添加节点的方法🐻
public void add(Node node) {
if (node == null) {
return;
}
if (node.value >= value) {
if (right != null) {
right.add(node);
}else {
right = node;
}
}else {
if (left != null) {
left.add(node);
}else {
left = node;
}
}
if (rightHeight() - leftHeight() > 1) {
if (right != null && right.leftHeight() > right.rightHeight()) {
right.rightRotation();
}
leftRotation();
}else if (leftHeight() > rightHeight()) {
if (left != null && left.rightHeight() > left.leftHeight()) {
left.leftRotation();
}
rightRotation();
}
}
代码分析🐨:
- 主要对左旋右旋操作进行讲解,前面的在BST处有详细讲解
- 如果右子树高度与左子树高度差值大于一,说明要进行左旋操作
- 当右子树不为空时,且右子树的左子树高度比右子树的右子树高度大,我们先要对右子树进行右旋,再进行左旋
- 如果左子树高度与右子树高度差值大于一,说明要进行右旋操作
- 当左子树不为空,且左子树的右子树高度比左子树的左子树高度大,我们先要对左子树进行左旋,再进行右旋
原因图解😶🌫️**😗*
未双旋转的结果
双旋转后的结果
AVL树类中🦁
6.对底层节点的方法调用即可🐻
public class AVLTree {
public Node root;
public int height(Node node) {
if (node == null) {
return 0;
}
return node.height();
}
public void add(Node node) {
if (root == null) {
root = node;
}else {
root.add(node);
}
}
代码分析🐨:
略
结论🐼
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
148)]
[外链图片转存中…(img-h2astd3j-1715881639148)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新