为什么不交换两个节点?
Why doesn't this swap the two nodes?
我正在尝试从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。您需要保留正在删除的节点的父母的父母,并修改其中的链接。
相关文章:
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- 比较两个节点坐标的最佳方法是什么?
- 使用 Dijkstra 算法跟踪两个节点之间的最短路径
- 图问题:找出两个节点是否在每个节点的O(1)时间和O(2)存储中共享同一分支
- 如何在单个链表中交换两个节点的位置,只修改指针
- 如何遍历具有两个节点的链接节点
- 查找树中两个节点之间的最大成本边
- 查找树(不属于任何特定类型的简单连接树)中两个节点之间的路径
- 为什么不交换两个节点?
- 使用 Dijkstra 算法计算两个节点之间的最短路径
- 在 C 语言的链表中查找最小的两个节点
- 当两个节点相互指向时,不可避免的内存泄漏
- 如何使用BFS查找两个节点之间的距离
- 添加两个节点并在比较时删除一个节点
- 如何在C++中合并二叉树的两个节点
- 树中两个节点之间的最小距离
- 反转两个节点之间的链表
- 切换链表中的两个节点
- 查找树中两个节点的最小共同祖先