c ++中的二叉树,指针

时间:2017-04-03 16:13:09

标签: c++ pointers tree binary-search-tree

我一直在实现二叉树,阅读了很多代码和文章,但没有找到我的问题的答案。我有一个类'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;
}

再见!

0 个答案:

没有答案