当前位置: 首页 > 知识库问答 >
问题:

为什么不交换两个节点?

陶山
2023-03-14

我试图解决leetcode中的一个问题—从BST中删除节点。我们将获得BST的根节点和密钥;我们必须删除以该键为值的节点。我们可以假设所有树节点都有唯一的值。我们必须在此操作后返回根节点。(问题链接为:https://leetcode.com/problems/delete-node-in-a-bst/description/).

我编写了以下代码:

// Example program
#include <iostream>
#include <string>

using namespace std;

  struct TreeNode {
      int val;
      TreeNode *left;
      TreeNode *right;
      TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 };

TreeNode* findSmallest(TreeNode* root) {
        if(!root) return NULL;

        TreeNode* prev=root;
        while(root->left) {
            cout<<"Visiting: "<<root->val<<"\n";
            prev=root;
            root=root->left;
        }
        prev->left=NULL;

        cout<<"Returning: "<<root->val<<" and prev was: "<<prev->val<<"\n";
        return root;
    }

    TreeNode* deleteNode(TreeNode* root, int key) {
        if(!root) return NULL;

        if(root->val == key) {
            //This is the node to be deleted
            TreeNode* smallestOnRight = findSmallest(root->right);

            //the lines below do not actually change the root node - why?
            if(smallestOnRight) smallestOnRight->left=root->left;
            if(smallestOnRight) smallestOnRight->right=root->right;
            root=smallestOnRight;

            return root;
        }

        if(root->val>key)
            deleteNode(root->left, key);
        if(root->val<key)
            deleteNode(root->right, key);

        return root;
    }

int main()
{
    TreeNode* root = new TreeNode(8);
    root->left = new TreeNode(3);
    root->left->left = new TreeNode(1);
    root->left->right = new TreeNode(6);
    root->left->right->left = new TreeNode(4);
    root->left->right->right = new TreeNode(7);

    root->right = new TreeNode(10);
    root->right->right = new TreeNode(14);
    root->right->right->left = new TreeNode(13);

    deleteNode(root, 3);

}

我想知道为什么评论下面的行实际上并没有改变根节点。所以,如果原始树像(a),那么在这个过程之后,新树像(b),而它应该像(c):

(a) :图像(a)
(b):图像(b)
(c):图像(c)

所以,基本上只有node3应该替换为node4,但不幸的是这并没有发生。为什么会这样?

编辑:因此输入为:

[8,3,10,1,6, null,14, null, null,4,7,13, null]
3

(树按级别顺序遍历)。

编辑:这是cpp。sh链接:http://cpp.sh/9h2z

共有1个答案

夹谷宜民
2023-03-14

您没有保留应该修改为指向node4的node8。您需要保留正在删除的节点的父节点并修改其中的链接。

 类似资料:
  • 问题内容: 我正在尝试了解go的内部原理。考虑以下代码 上面的代码完美地交换了2个数字,a变成5,b变成10。我无法理解它是如何工作的。在第二行代码中考虑,如果将a首先分配给b,则b将为10。现在,如果将b分配给a,那么a也不应也为10。 请帮助我了解它是如何工作的 谢谢 问题答案: TL; DR :反汇编表明CPU必须足够聪明才能看到正在发生的事情,并使用寄存器来避免覆盖内存中的现有值。 这个问

  • 问题内容: 我有以下代码: 我希望它能打印a = 2 b = 1,但它却打印相反的东西。因此很明显,swap方法不会交换a和b值。为什么? 问题答案: 这与整数的不变性无关。它与 Java是值传递 ,该死 的事实有关! (不烦恼,只是文章标题:p) 总结一下:您实际上不能在Java中创建交换方法。您只需要在需要的地方自己进行交换即可。反正这只是三行代码,所以应该不成问题:)

  • 我在谷歌上搜索了这个,但他们都在谈论“交换节点而不交换数据”。 我尝试自己编写一个交换节点方法: 如您所见,和相互更改,但打印结果不交换。如何交换两个节点及其数据? 编辑:下面的完整示例

  • 我有一个无序数组,由连续的整数组成,没有任何重复项。允许交换任意两个元素。我需要找到按升序对数组排序所需的最小交换数。 在本例中,您可以看到,对于p=1,当索引为0和1时,交换不发生。 我改变了b[p-1],b[b.index(p)]的顺序,我不再有同样的问题了,但我不明白原因。

  • 我是初学者,我想通过使用两个旧映射hm1和hm2创建一个新映射hm3,在该映射中,我需要第二个映射的值作为键,第一个映射的值作为值,例如:如果映射hm1包含a1作为key1和abc作为value1,它还包含a2作为key2和xyz作为value2,并且还有另一个映射hm2,它包含a1作为key1和b1作为value1,还包含a2作为key2和b2作为value2,那么在映射hm3中,我需要b1作为

  • 如果一个表达式包含任何整数大小或更小的内容,其结果总是整数,即使两个字节之和适合一个字节。 为什么我们在一个字节中添加最后两个字节时会发生这种情况?没有编译器错误。