我正在尝试实现一个AVL树,并且不确定插入和跟踪每个节点的父节点的最佳方法。这是教育性的,所以请不要建议“使用提升”:)
这编译但我不相信它的正确性或它是最好的方法。 特别是这个
insert(someNumber,root,root);
此外,当我重新平衡并向上移动树时,我将重做高度部分。
我这样插入
myTree.insert(someNumber);
这是方法。我不确定我的第二个参数应该在这里。我会想到NULL,但编译器不喜欢(不同的函数定义)。
void Tree::insert(int someNumber){
insert(someNumber,root,root);
}
这是我的插入
void Tree::insert(int someNumber,Node*& subTreeRoot,Node*& parent){
if(subTreeRoot==NULL)
{
subTreeRoot = new Node(someNumber,parent);
if(subTreeRoot->myParent)
}
else if (someNumber<subTreeRoot->myNumber)
{
if((subTreeRoot->right==NULL)||((subTreeRoot->left!=NULL)&&(subTreeRoot->right!=NULL)))
subTreeRoot->height++;
insert(someNumber,subTreeRoot->left,subTreeRoot);
}
else
{
if((subTreeRoot->left==NULL)||((subTreeRoot->left!=NULL)&&(subTreeRoot->right!=NULL)))
subTreeRoot->height++;
insert(someNumber,subTreeRoot->right,subTreeRoot);
}
}
-
答案 0 :(得分:1)
由于你是为教育做这件事,我建议你手工处理一些案件,然后把它们编码成表格的测试
Insert(6);
Insert(11);
// ...
Insert(3);
Node test = root;
assert(root->height == 3);
assert(root->value == 6);
test = root->right;
assert( ... );
这些数字完全弥补了。
这将
答案 1 :(得分:0)
树和节点之间有什么区别? (树只是根节点的占位符,仅此而已。一个节点有时被称为有两个子树。树和节点没有区别。一个类就足够了。)
为什么不随时计算身高?更容易编程和证明正确。如果性能对您有害,您可以随时更改该函数以返回缓存值。
节点不应该知道它的父节点(在我看来)。因此insert函数需要父参数。创建新节点后,比较父母 - 孩子的深度,看看是否需要进行任何旋转。对旋转进行编程很棘手:尝试,调试和测试!
Node::insert(int number,Node * parent)
{
//code
left=new node(number);
if (parent->left->depth() > parent->right->depth()+1)
parent->rotate_tree_or_something();
//
}