📅  最后修改于: 2023-12-03 15:28:37.640000             🧑  作者: Mango
这是GATE CS 2011的问题11,涉及到二叉树中节点的删除操作。具体的问题描述如下:
给定一个二叉树和一个节点的值,删除该二叉树中所有值等于给定节点的节点。
其中,二叉树的定义如下:
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
思路:
删除节点时需要遍历整棵二叉树,找到值等于给定节点的节点。如果该节点是叶子节点,直接删除即可;如果该节点只有左子节点或右子节点,将其子节点链接到该节点的父节点上;如果该节点既有左子节点又有右子节点,需要找到其右子树中的最小节点,将该节点的值替换为最小节点的值,然后再删除最小节点。
代码实现如下:
TreeNode* deleteNode(TreeNode* root, int val) {
if (!root) return root;
if (root->val == val) {
if (!root->left && !root->right) return NULL; // 删除叶子节点
if (!root->left) return root->right; // 右子节点不为空
if (!root->right) return root->left; // 左子节点不为空
TreeNode* cur = root->right;
while (cur->left) cur = cur->left; // 找到右子树中的最小节点
root->val = cur->val; // 用最小节点的值替换该节点的值
root->right = deleteNode(root->right, cur->val); // 删除最小节点
return root;
}
if (root->val > val) root->left = deleteNode(root->left, val); // 在左子树中删除节点
else root->right = deleteNode(root->right, val); // 在右子树中删除节点
return root;
}
时间复杂度为O(h),其中h为二叉树的高度。