遍历二叉搜索树C++

traversing binary search tree C++

本文关键字:C++ 搜索树 遍历      更新时间:2023-10-16

我正在做一个编程作业,并编写了一堆函数来实现二叉搜索树,并给出了一些函数。我以为我理解递归,但如果你愿意的话,我一直在切换方向。

这是赋值给出的函数:

static void deleteAll(BSTNode<Data>* n) {
  if (0 == n) return;
  deleteAll(n->left);
  deleteAll(n->right);
  delete n;
}

要删除一棵非常短的树,

 根  /   \左撇子 右

我打电话给deleteAll(root). n != 0所以现在我打电话给deleteAll(lefty). n != 0所以我打电话给deleteAll(lefty->left).当然没有左节点。当我添加左节点时,我的构造函数将左、右和父指针初始化为 0,所以现在n == 0 .所以我返回函数并且永远不会删除右边。我怎么去deleteAll(n->right)

正如我所说,提供了此功能,所以我不应该更改它。我想也许我必须调用deleteAll(b.begin())b.end()才能从最左边或最右边的节点开始,但每次我在脑海中浏览它时,我都会点击n == 0

请帮助我理解。

想象一个指向当前正在执行的行的箭头。当我们调用 deleteAll(root) 时,首先我们检查 root 是否为 0:

--> if (0 == root) return;
    deleteAll(root->left);
    deleteAll(root->right);
    delete root;

因为root != 0,我们称之为deleteAll(root->left)

    if (0 == root) return;
--> deleteAll(root->left); /*
    |-1-> if (0 == lefty) return;
    |-2-> deleteAll(lefty->left);
    |-3-> deleteAll(lefty->right);
    |-4-> delete lefty; */
    deleteAll(root->right);
    delete root;
  }

现在箭头将移回函数的顶部并开始对lefty执行相同的操作,运行我评论中的第 1-4 行(在第 2 行,相同的扩展将再次发生,直到找到空节点)。但这里重要的是,它会记住它在函数调用之前的位置,以便以后可以恢复。所以deleteAll(root->left)会去做它所做的事情,最终会回来。然后原始调用继续:

    if (0 == root) return;
    deleteAll(root->left);
--> deleteAll(root->right);
    delete root;

现在,正确的节点也被删除了。这发生在递归的每一步。请记住,return只返回当前函数,而不是整个递归链。

返回仅返回到调用它的函数。在deleteAll(lefty)的情况下(如果我理解正确,要么是那个,要么是deleteAll(root))。 deleteAll(n->right)将在deleteAll(n->left)返回后接到电话。删除全部的后置条件是 n 及其所有子项都将被删除。

假设我们有以下树:

    a
   / 
   b c
  /   
 d     e

调用图将如下所示:

deleteAll(a)
    deleteAll(a->left)
        deleteAll(a->left->left)
            deleteAll(a->left->left->left)
            deleteAll(a->left->left->right)
        deleteAll(a->left->right)
    deleteAll(a->right)
        deleteAll(a->right->left)
        deleteAll(a->right->right)
            deleteAll(a->right->right->left)
            deleteAll(a->right->right->right)

或者就节点名称而言:

deleteAll(a)
    deleteAll(b)
        deleteAll(d)
            deleteAll(NULL)
            deleteAll(NULL)
        deleteAll(NULL)
    deleteAll(c)
        deleteAll(NULL)
        deleteAll(e)
            deleteAll(NULL)
            deleteAll(NULL)