【发布时间】:2019-07-03 09:42:21
【问题描述】:
我想实现以下功能:在二叉搜索树中删除某个值的节点。我想通过两个步骤来做到这一点: 1.找到值的节点 2.删除节点。
//Definition for a binary tree node.
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
为了简化问题,假设要删除的节点是叶子,那么我们可以直接删除。
我已经实现了返回对treenode指针的引用的搜索功能,所以我可以直接改变树结构而不需要跟踪父节点。但它不起作用(节点没有被删除)。
TreeNode *&searchBST(TreeNode *&root, int val)
{
if (!root)
return root;
if (root->val == val)
return root;
else if (root->val > val)
{
return searchBST(root->left, val);
}
else
{
return searchBST(root->right, val);
}
}
我还实现了搜索函数,它返回指向树节点指针的指针,它可以工作。
TreeNode **searchBST(TreeNode *&root, int val)
{
if (!root)
return &root;
if (root->val == val)
return &root;
else if (root->val > val)
{
return searchBST(root->left, val);
}
else
{
return searchBST(root->right, val);
}
}
完整代码:
#include <iostream>
using namespace std;
//Definition for a binary tree node.
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode *&searchBST(TreeNode *&root, int val)
{
if (!root)
return root;
if (root->val == val)
return root;
else if (root->val > val)
{
return searchBST(root->left, val);
}
else
{
return searchBST(root->right, val);
}
}
TreeNode *deleteNode(TreeNode *root, int key)
{
TreeNode *node = searchBST(root, key);
if (!node)
return root;
node = NULL;
return root;
}
int main()
{
TreeNode n1(1), n2(0), n3(2);
n1.left = &n2;
n1.right = &n3;
TreeNode *res = deleteNode(&n1, 2);
return 0;
}
有效的代码:
#include <iostream>
using namespace std;
//Definition for a binary tree node.
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
TreeNode **searchBST(TreeNode *&root, int val)
{
if (!root)
return &root;
if (root->val == val)
return &root;
else if (root->val > val)
{
return searchBST(root->left, val);
}
else
{
return searchBST(root->right, val);
}
}
TreeNode *deleteNode(TreeNode *root, int key)
{
TreeNode **node = searchBST(root, key);
if (!node)
return root;
*node = NULL;
return root;
}
int main()
{
TreeNode n1(1), n2(0), n3(2);
n1.left = &n2;
n1.right = &n3;
TreeNode *res = deleteNode(&n1, 2);
if (res->right != NULL)
cout << res->right->val << endl;
return 0;
}
【问题讨论】:
-
“它不起作用”是什么意思?如果有编译器错误,您应该将它们包含在问题中
-
很抱歉给您带来了困惑。可以编译但节点没有被删除。
-
你怎么知道的?没有输出...
-
再次强调:
deleteNode与众不同。*node = NULL;与node = NULL;非常不同
标签: c++