BST中的 insert 方法非递归实现

来源:5-3 二分搜索树的节点插入

Karen_Ng

2017-05-02

Node* __insert2(Node* node, Key key, Value value){
   Node* tmpNode = node;
   while(true){
       if (tmpNode == NULL){
           tmpNode = new Node(key, value);
           count++;
           break;
       }
       if( key == tmpNode->key)
           tmpNode->value = value;
           break;
       if( key < tmpNode->key )
           tmpNode = tmpNode->left;
       else
           tmpNode = tmpNode->right;
   }
   return tmpNode;// 这里应该 return tmpNode 还是 node 本身?
}

这是我理解的非递归实现,但是总感觉有什么不对,还请老师指点(我看了一下后面的测试用例,一步步调试还是没搞清楚最后 return 的 node 应该是哪一个)

写回答

2回答

liuyubobobo

2017-05-03

使用非递归的时候,就不需要返回值了,也不需要写辅助函数__insert了,直接在可以对外调用的函数insert中,使用循环的方式找到待插入位置的父亲节点,然后让父亲节点的左孩子或者右孩子指向一个新的节点就好了。再想想看:)加油!

0
1
Karen_Ng
非常感谢!
2017-05-09
共1条回复

Karen_Ng

提问者

2017-05-09

template <typename Key, typename  Value>
void insert(Node* node, Key key, Value value)
{
    Node *prev = NULL;
    Node *current = node;

    // 查找插入位置
    while (current != NULL)
    {
        prev = current;
        if (key < current->key)
            current = current->left;
        else
            current = current->right;
    }
    //插入节点 newNode
    Node* newNode = new Node(key, value);
    if (prev==NULL)
        node = newNode;
    else if (newNode->key < prev->key)
        prev->left = newNode;
    else
        prev->right = newNode;
}

谢谢波波的解释,我重新改写了之前的算法,但是我总感觉少了点什么,又看不出来,QAQ

0
2
追风的云
为啥格式是这样子?
2018-01-04
共2条回复

算法与数据结构(C++版) 面试/评级的算法复习技能包

课程专为:短时间内应对面试、升职测评等艰巨任务打造

11187 学习 · 1614 问题

查看课程