首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将指针更改为指针引用指针

将指针更改为指针引用指针
EN

Stack Overflow用户
提问于 2014-07-09 20:05:06
回答 2查看 145关注 0票数 1

我有一个将一个节点插入到二叉树中的方法,它使用指向指针的指针来正确分配树中的新节点。

在使用C++时,我认为可以将这个指针更改为对指针的引用,从而得到更干净的C++代码。但如何做到这一点,并保持正确的分配?

代码语言:javascript
复制
bool insert(T value) {
    node** buff = &root;

    while ((*buff) != NULL) {
        if (value == (*buff)->value) {
            return false;
        } else if (value < (*buff)->value) {
            buff = &(*buff)->left;
        } else {
            buff = &(*buff)->right;
        }
    }

    *buff = new node(value);
    return true;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-09 21:16:07

没有测试,但这是一个想法:当您在父级时插入,而不是当您降至null时插入:

代码语言:javascript
复制
bool insert(T value) {
    if (root == nullptr) {
       root = new node(value);
       return true;
    }

    node* buff = root;    
    while(buff->value != value) {        
        if (value < buff->value) {
            if(buff->left == nullptr {
               buff->left = new node(value);
               return true;
            }
            buff = buff->left;
        } else {
            if (buff->right == nullptr) {
               buff->right = new node(value);
               return true;
            }
            buff = buff->right;
        }
    }

    return false;
}

我会怎么写:

代码语言:javascript
复制
// returns the node under which the insertion must be done
// or nullptr if the value already exists in the tree
// prereq: tree must be not empty
node* findParentInsertionPoint(T value) {
    if (root == nullptr) {
       throw std::logic_erro("");
    }

    node* n = root;    
    while(n->value != value) {        
        if (value < n->value) {
            if(n->left == nullptr {
               return buff;
            }
            n= n->left;
        } else {
            if (n->right == nullptr) {
               return n;
            }
            n= n->right;
        }
    }
    return nullptr;
}

// inserts a leaf as child of parent
// prereq: parent must be not null
// the corresponding child must be null;
void insertLeafAt(T value, node * parent) {
   if (parent == nullptr) {
      throw std::logic_error("");
   }
   if (value < parent->value) {
      parent->left = new node(value);
   } else {
     parent->right = new node(value);
   }
}

bool insert(T value) {
    if (root == nullptr) {
       root = new node(value);
       return true;
    }

    node* parent = findParentInsertionPoint(value);
    if (parent == nulptr) {
       return false;
    }
    insertLeafAt(T value, parent);
    return true;
}
票数 2
EN

Stack Overflow用户

发布于 2014-07-09 20:21:02

您不能重新分配引用,因此由于buff = &(*buff)->left;

不能将node** buff = &root;更改为node*& buff = root; (并将(*buff)替换为buff)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24662862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档