在AVL树上设置父级

时间:2010-08-06 00:02:04

标签: computer-science avl-tree

我正在尝试实现一个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);
    }
}

-

2 个答案:

答案 0 :(得分:1)

由于你是为教育做这件事,我建议你手工处理一些案件,然后把它们编码成表格的测试

 Insert(6);
 Insert(11);
 // ...
 Insert(3);

 Node test = root;
 assert(root->height == 3);
 assert(root->value == 6);
 test = root->right;
 assert( ... );

这些数字完全弥补了。

这将

  1. 不仅仅是感觉您的代码是否有效。 (提示:如果您不确定您的代码是否有效,则可能不是)
  2. 给你一个开始弄清楚出了什么问题的地方。
  3. 养成测试习惯。对于一些人而言,编写两倍代码(测试+代码)比仅仅编写代码更快,但是尝试它是违反直觉的。再写更多代码=更多练习。

答案 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();
  //
}