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