二进制搜索树插入中迭代和递归的区别

Difference between iteration and recursion in binary search tree insertion

本文关键字:递归 区别 迭代 搜索树 插入 二进制      更新时间:2023-10-16

我正在尝试在二进制搜索树中实现插入。根据我的逻辑,递归和迭代都在执行非常相似的任务——然而,我的递归函数有效,但迭代解决方案无效。执行上有什么区别?为什么迭代函数不起作用?(忽略不同的退货类型)

出现的错误是,在迭代的情况下,只有一个元素被正确插入。连续插入不起作用。

类别定义:

class Node
{
    public:
        Node(int x, Node *l = NULL, Node *r = NULL)
        {
            val = x;
            left = l;
            right = r;
        }
        int val;
        Node *left;
        Node *right;
};

迭代:

Node* insert(Node* &root, int x)
{
    Node* newNode = new Node(x);
    if (root == NULL)
    {
        root = newNode;
        return root;
    }
    else
    {
        Node* travNode = root;
        while (travNode != NULL)
        {
            if (x < travNode->val)
                travNode = travNode->left;
            else
                travNode = travNode->right;
        }
        travNode = newNode;
    }
    return root;
}

递归:

void insert(Node* &root, int x)
{
    if (root == NULL)
    {
        Node* newNode = new Node(x);
        root = newNode;
    }
    else
    {
        if (x < root->val)
            insert(root->left, x);
        else
            insert(root->right, x);
    }
}

谢谢!

在递归中,当您调用insert()时,整个函数都会执行,这是正确的。

在迭代解决方案中,您会找到一个节点,该节点将是新节点的父节点,但您会用新节点覆盖该节点,而不是将其设置为子节点。

您需要在某个位置安装travNode->left = newNodetravNode->right = newNode