Computer science 在AVL树上设置父级

Computer science 在AVL树上设置父级,computer-science,avl-tree,Computer Science,Avl Tree,我正在尝试实现一个AVL树,但不确定插入和跟踪每个节点的父节点的最佳方法。这是教育性的,因此请不要建议“使用boost”: 这可以编译,但我不相信它的正确性,也不相信它是最好的方法。 特别是这个 insert(someNumber,root,root); 此外,当我重新平衡并向树上移动时,我将重做高度部分 我是这样插入的 myTree.insert(someNumber); 这里是方法。我不确定我的第二个情人应该在这里。我本以为为NULL,但编译器不喜欢(不同的函数定义) 这是我的插页 vo

我正在尝试实现一个AVL树,但不确定插入和跟踪每个节点的父节点的最佳方法。这是教育性的,因此请不要建议“使用boost”:

这可以编译,但我不相信它的正确性,也不相信它是最好的方法。 特别是这个

insert(someNumber,root,root);
此外,当我重新平衡并向树上移动时,我将重做高度部分

我是这样插入的

myTree.insert(someNumber);
这里是方法。我不确定我的第二个情人应该在这里。我本以为为NULL,但编译器不喜欢(不同的函数定义)

这是我的插页

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);
    }
}
void Tree::insert(int-someNumber、Node*&subTreeRoot、Node*&父节点){
if(subTreeRoot==NULL)
{
subTreeRoot=新节点(someNumber,父节点);
如果(subTreeRoot->myParent)
}
else if(someNumbermyNumber)
{
如果((subtreroot->right==NULL)| |((subtreroot->left!=NULL)&&(subtreroot->right!=NULL)))
子树根->高度++;
插入(someNumber,subTreeRoot->left,subTreeRoot);
}
其他的
{
如果((subtreroot->left==NULL)| |((subtreroot->left!=NULL)&&(subtreroot->right!=NULL)))
子树根->高度++;
插入(someNumber,subTreeRoot->right,subTreeRoot);
}
}

-

既然您这样做是为了教育,我建议您手工编写一些案例,然后将它们编码到表单的测试中

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

 Node test = root;
 assert(root->height == 3);
 assert(root->value == 6);
 test = root->right;
 assert( ... );
这些数字完全是虚构的

这将

  • 给您的不仅仅是代码是否正常工作的感觉。(提示:如果您不确定您的代码是否正常工作,则可能无法正常工作)
  • 给你一个开始找出问题所在的地方
  • 养成测试的习惯。对一些人来说,编写两倍的代码(测试+代码)比一开始就编写代码要快,这是违反直觉的,但是请尝试一下。加上编写更多的代码=更多的实践

  • 树和节点之间有什么区别?(树只是根节点的占位符,仅此而已。一个节点有时被称为有两个子树。树和节点没有区别。一个类就足够了。)

    为什么不在你需要的时候计算一下高度呢?更容易编程和证明正确。如果性能对您不利,您可以随时更改函数以返回缓存值

    节点不应该知道它的父节点(在我看来)。因此,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();
      //
    }
    

    我已经测试了很多次了。你的断言看起来不错。我非常想要一个好的EclipseCDT单元测试插件或框架。尽管如此,我不确定这是否回答了关于父母的问题。我想我会重新平衡并遍历父节点进行测试。节点是树的一部分。Node1/\Node2 Node3在没有父子关系的情况下,如何“新节点比较父子深度”?如果节点不知道自己是父节点,在AVL树中,如何在重新平衡时爬树?
    Node::insert(int number,Node * parent)
    {
      //code
      left=new node(number);
      if (parent->left->depth() > parent->right->depth()+1)
        parent->rotate_tree_or_something();
      //
    }