为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
Why do we return a pointer to a node instead of void function for avl tree implementation?
好吧,所以我似乎有点迷路了。我正在尝试将数据插入树中,当检查平衡和是否旋转时,我默认通过根进行检查。当我在线查看示例时,我发现我们也可以沿着树中的其他节点进行旋转。我们如何确定使用哪个节点来平衡树,以及如何到达所述节点?我还看到,人们使用节点指针返回类型,而不是使用void函数来实现插入和旋转函数。这样做的目的是什么?我知道答案可能非常明显,我只是迷路了。
struct TNode{
int data;
TNode* left;
TNode* right;
};
class Tree{
public:
TNode* root;
public:
Tree()
{root = nullptr;}
int height(TNode* node);
int balanceFactor(TNode* node);
bool isBalance(TNode* node)
{return balanceFactor(node)<-1 && balanceFactor(node)>1?true:false;}
void avlInsert(int key);
void LLRotation(TNode* node);
};
int Tree::height(TNode* node){
int l = 0;
int r = 0;
if(!node->left && !node->right)
return 0;
if(node->left)
l = height(node->left) + 1;
if(node->right)
r = height(node->right) + 1;
return l > r ? l : r;
}
int Tree::balanceFactor(TNode *node){
if(node->left && node->right)
return height(node->left) - height(node->right);
else if(node->left && !node->right)
return height(node);
else
return -1 * height(node);
}
void Tree::LLRotation(TNode *node){
TNode* nl = node->left;
node->left = nl->right;
nl->right = node;
if(root == node)
root = nl;
}
void Tree::avlInsert(int key){
TNode* trav;
TNode* follow;
TNode* node = new TNode;
node->data = key;
node->left = nullptr;
node->right = nullptr;
if (!root)
root = node;
else{
trav = root;
while (trav){
if (key < trav->data){
follow = trav;
trav = trav->left;
}
else{
follow = trav;
trav = trav->right;
}
}
if(key < follow->data)
follow->left = node;
else
follow->right = node;
}
if (balanceFactor(root) == 2 && balanceFactor(root->left) == 1)
LLRotation(root);
}
这实际上取决于您的实现——有些人希望返回一个节点,使用void函数不会对结果有太大改变。对于插入函数,你只需要在插入节点后进行检查,这样你就可以继续插入该节点,而不是旋转它。请注意,只有当你有一个AVL树开始时,这个函数才会起作用。此外,您的代码不正确,如下所示:
if (balanceFactor(root) == 2 && balanceFactor(root->left) == 1)
LLRotation(root);
这不是检查插入的方式。。。。这是删除的,伙计,我想你搞混了。通常在插入时,你会检查balanceFactor是否在1和-1之间,所以如果你得到2,那么在你的情况下,它是一棵左重树,因为它是左右的,这意味着你应该进行右旋转。。。。。。。。伙计。。。。。。
int l = 0;
int r = 0;
if(!node->left && !node->right)
return 0;
if(node->left)
l = height(node->left) + 1;
if(node->right)
r = height(node->right) + 1;
return l > r ? l : r;
高度功能,效率极低。。。相反,将高度定义为节点的变量,然后在每次插入、删除后对其进行修改。
相关文章:
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 指向二叉树中新节点的指针
- C++创建指向有向图中节点的指针数组
- 使用函数引用指向节点的指针删除链表中的节点?
- 函数无法识别我在C++传递节点指针向量?
- 如果我们不创建一个新节点并使用指针插入数据并建立链接(在链表中)怎么办?
- 如何在单个链表中交换两个节点的位置,只修改指针
- C++中是否有一个函数可以为您获取指向该节点的所有指针的地址空间
- 如何删除由节点组成的树,并相互指向彼此的指针?
- 具有 4 个指针的节点的递归插入函数返回 null
- 如何使用指针连接两种不同的节点类型(结构)?
- C 中的学生指针节点列表中的内存泄漏
- 如果我删除指向节点的指针数组,节点本身是否会被删除
- 交换树数据结构中根的 2 个子节点指针
- 使用指针打印链表中的节点
- 我们不能在不使用指向对象的指针的情况下创建节点C++吗?
- C 指针节点帮助 - 将参数复制到链接的列表节点更改该节点的不同部分
- C++指针节点
- 括号和指针节点