chapter_tree/avl_tree/ #85
Replies: 70 comments 92 replies
-
这部分确实是有点难度 |
Beta Was this translation helpful? Give feedback.
-
K神有时间可以更新一章红黑树的区别吗?想看看它们的区别和各自的应用场景,感谢! |
Beta Was this translation helpful? Give feedback.
-
您好,请问python的会更新吗 |
Beta Was this translation helpful? Give feedback.
-
K神会更新图数据结构嘛 ? |
Beta Was this translation helpful? Give feedback.
-
大佬,请问这一节中哪些函数归在private,哪些函数归在public中,这方面有什么考量吗?比如为什么要将 height 函数和 updateHeight 函数 分别放在 public 和 private 中呢? |
Beta Was this translation helpful? Give feedback.
-
有个疑问,我看右旋操作是处理失衡节点node、child、grandchild之间的关系,那node的父级和node原来的连接不需要维护吗?右旋操作后岂不是断掉了? |
Beta Was this translation helpful? Give feedback.
-
k神,这部分还会介绍红黑树吗? |
Beta Was this translation helpful? Give feedback.
-
大佬,想问一下,updateHeight()方法里为啥要 + 1 操作? |
Beta Was this translation helpful? Give feedback.
-
/* 右旋操作 */ |
Beta Was this translation helpful? Give feedback.
-
讲的不错,经过你的讲解感觉AVL树只有红黑树10%的难度 |
Beta Was this translation helpful? Give feedback.
-
复刻了一下 感觉可以的 |
Beta Was this translation helpful? Give feedback.
-
大佬,先左旋再右旋那张图,child.left=node, node.left=null也可以达到平衡吧,只是破坏了二叉搜索树的规则,这种做法属于左旋吗?左旋的时候child既可以取node左子节点也可以取右子节点吧,右旋同理 |
Beta Was this translation helpful? Give feedback.
-
if t.balanceFactor(node.Left) >= 0 { 为什么判断条件是 >= 0,是不是 > 0 也可以,因为左右高度差不可能为 0 |
Beta Was this translation helpful? Give feedback.
-
为什么不用 updateHeight(grandChild) 呀? |
Beta Was this translation helpful? Give feedback.
-
这里讲的真好,清楚易懂 |
Beta Was this translation helpful? Give feedback.
-
感觉挺清楚的,期待加入红黑树 |
Beta Was this translation helpful? Give feedback.
-
我个人对平衡二叉树旋转的理解: |
Beta Was this translation helpful? Give feedback.
-
使失衡节点重新恢复平衡, 应该是使得 不平衡节点 恢复平衡? |
Beta Was this translation helpful? Give feedback.
-
有个问题,自己运行的时候。。会报错,然后删了如TreeNode | None 这些注释,就可以了 |
Beta Was this translation helpful? Give feedback.
-
在“图 7-27 有 grand_child 的右旋操作”示意图中,节点5应该不是不平衡节点吧,它的平衡因子应该是1吧 |
Beta Was this translation helpful? Give feedback.
-
def update_height(self, node: TreeNode | None): |
Beta Was this translation helpful? Give feedback.
-
"我们需要从这个节点开始,自底向上执行旋转操作,使所有失衡节点恢复平衡",在插入和删除的时候,这句话没有看懂,rotate(TreeNode node) 里面是往下去检查子节点的平衡因子? |
Beta Was this translation helpful? Give feedback.
-
这段可以修改为return child吗,因为我觉得只有一个子节点时不需要再更新子节点的高度和平衡了 |
Beta Was this translation helpful? Give feedback.
-
求教各位,图 7-26 中节点“4” 和节点“3”都是失衡节点都是2,都是为什么执行节点“3”的右旋而不是节点“4”的右旋呢? |
Beta Was this translation helpful? Give feedback.
-
删除节点的代码: /* 递归删除节点(辅助方法) */
TreeNode removeHelper(TreeNode node, int val) {
if (node == null)
return null;
/* 1. 查找节点并删除 */
if (val < node.val)
node.left = removeHelper(node.left, val);
else if (val > node.val)
node.right = removeHelper(node.right, val);
else {
if (node.left == null || node.right == null) {
TreeNode child = node.left != null ? node.left : node.right;
// 子节点数量 = 0 ,直接删除 node 并返回
if (child == null)
return null;
// 子节点数量 = 1 ,直接删除 node
else
node = child;
} else {
// 子节点数量 = 2 ,则将中序遍历的下个节点删除,并用该节点替换当前节点
TreeNode temp = node.right;
while (temp.left != null) {
temp = temp.left;
}
node.right = removeHelper(node.right, temp.val);
node.val = temp.val;
}
}
updateHeight(node); // 更新节点高度
/* 2. 执行旋转操作,使该子树重新恢复平衡 */
node = rotate(node);
// 返回子树的根节点
return node;
} 子节点数为0或1的时候,应该都可以直接返回吧,不需要执行后序的旋转操作。 if(node.left == null) {
return node.right;
}
if(node.right == null) {
return node.left;
} |
Beta Was this translation helpful? Give feedback.
-
大家好,我是之前提问过有关二叉树概念的盲人。 稍微叠个甲,当然如果有其他盲人小伙伴看到,不要介意我总是提起这点,实在是因为如果不说,其他小伙伴就不太好针对我的提问进行有效的回答。 之前学习数据结构,到树开始,就有点一知半解了,我其实很不喜欢这种感觉。我很希望能搞懂它。 不得不说,很多时候,图解真的可以让我们少走许多弯路。例如我之前理解树的前序遍历、中序遍历、后序遍历,我读到类似“先便利左子树,然后便利根节点,最后便利右子树”,或者“先便利根节点,然后便利左子树,然后是右子树”时,脑子里总是很混乱。 昨天突然在看使用递归方式进行前中后序遍历的代码时发现,使用递归和自相似性的思想理解二叉树便利会更好。 好了,废话完毕,今天的问题是有关如何理解树的旋转的。主要是想让大家看看我的理解是否正确。 我根据表 7-3 脑补了如下失衡二叉树,由于我不太好用纯文本画二叉树,用语言描述可能啰嗦,我就写成数组形式:
其实,这就是一个退化的链表。此时,根节点的平衡因子是 根据代码,有: /* 左旋操作 */
TreeNode *leftRotate(TreeNode *node) { // 本例中为根节点 1
TreeNode *child = node->right; // 本例中为节点 2
TreeNode *grandChild = child->left; // nullptr
// 以 child 为原点,将 node 向左旋转
child->left = node; // 1
// 此时,child 已经成为一个结构为 [2,1,3] 的二叉树
// 且此时 node->right->left <=> child->left <=> node
node->right = grandChild; // nullptr
// 更新节点高度
updateHeight(node); // 2 -> 0
updateHeight(child); // 1 -> 1
// 返回旋转后子树的根节点
return child;
} 不知道理解有没有问题,但还是感觉有点没明白。 |
Beta Was this translation helpful? Give feedback.
-
图 7-26 右旋操作步骤 执行完方法,TreeNode rightRotate(TreeNode node) 后,根节点是哪个?还能宽度优先遍历么? |
Beta Was this translation helpful? Give feedback.
-
C语言代码中AVLTree的结构体定义有吗 |
Beta Was this translation helpful? Give feedback.
-
文章已经写的很清晰了,但是没有动图, 看了这篇文章更好理解 🫡 |
Beta Was this translation helpful? Give feedback.
-
我想知道这个应该学到什么程度才算掌握啊,是不是要能凭借自己可以全敲出来才算掌握,然后在去学下一个结构啊 |
Beta Was this translation helpful? Give feedback.
-
chapter_tree/avl_tree/
Your first book to learn Data Structure And Algorithm.
https://www.hello-algo.com/chapter_tree/avl_tree/
Beta Was this translation helpful? Give feedback.
All reactions