我一直在实现二叉树,阅读了很多代码和文章,但没有找到我的问题的答案。我有一个类'btree',结构'节点'和许多方法。我想为DSW algorythm编写方法。 @edit - (Day-Stout-Warren Algorythm - 问题是让树只有正确的分支,就像一个元素列表)
struct node{
int key_value;
node *left;
node *right;
};
我有这样的轮换方法:
node *btree::ll_rotation(node *leaf){
node *temp;
temp = leaf->right;
leaf->right = temp->left;
temp->left = leaf;
return temp;
}
node *btree::rr_rotation(node *leaf){
node *temp;
temp=leaf->left;
leaf->left = temp->right;
temp->right = leaf;
return temp;
}
现在问题: 当我使用这些方法和'root'(root在类中声明)时,它可以工作,例如:
void btree::dsw1(){
root=dsw1(root);
}
node *btree::dsw1(node *leaf){
while (leaf->left) {leaf=rr_rotation(leaf);}
return leaf;
}
这是有效的,直到我更改节点为止。 '叶=叶子 - >右' 我想让所有树都行一行,所以我必须编写代码:
node *btree::dsw1(node *leaf){
while(leaf!=NULL){
if (leaf->left) {leaf=rr_rotation(leaf);}
else if (leaf->right) leaf = leaf->right;
else break;
}
return leaf;
}
此功能不起作用。我可以完成创建该行的唯一方法是编写
dsw1(root);
dsw1(root->right);
dsw1(root->right->right);
...
dsw1(root->right....);
如果我创建任何新指针并尝试深入树中,你能否告诉我为什么它不起作用?谢谢你的帮助。
此代码不起作用
node *btree::dsw1(node *leaf){
node *temp;
temp=leaf;
while(temp!=NULL){
if (temp->left) {temp=rr_rotation(temp);}
else if (temp->right) temp = temp->right;
else break;
}
while (parent(temp)) {temp=parent(temp);}
return temp;
}
没有线
while (parent(temp)) {temp=parent(temp);}
也不起作用
@ UP2
void btree::dsw1(){
node *temp;
temp=root->left->right;
temp=rr_rotation(temp);
root->left->right=temp;
}
此代码有效,但我不知道如何理解它以及如何使用知识修复我的代码,这意味着可以在每棵树上工作,所以我不能使用 - > ..-> .. - >
@ UP3
最后,递归获胜 - 这是我希望不会再出现任何问题的代码。感谢您的建议和帮助,我想我已经完成了这一部分。万分感谢你! 此函数将树转换为单分支树(元素列表):
node *btree::dsw1(node *leaf){
while(leaf->left) {leaf=rr_rotation(leaf);}
if (leaf->right) leaf->right=dsw1(leaf->right);
return leaf;
}
再见!