为什么不交换两个节点?

Why doesn't this swap the two nodes?

本文关键字:两个 节点 交换 为什么不      更新时间:2023-10-16

我正在尝试从leetcode中求解一个问题 - 从BST删除节点。我们将获得BST和键的根节点;我们必须用该键作为值删除节点。我们可以假设所有树节点都有唯一的值。我们必须返回此操作后的根节点。(问题链接是:https://leetcode.com/problems/delete-node-inde-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替换CC_1,但不幸的是,这不会发生。为什么这样?

编辑:因此输入将是:

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

(树按级别顺序横穿(。

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

您尚未保留应修改以指向Node4的Node8。您需要保留正在删除的节点的父母的父母,并修改其中的链接。