📜  门| GATE CS 2011 |问题11(1)

📅  最后修改于: 2023-12-03 15:28:37.640000             🧑  作者: Mango

GATE CS 2011 | 问题11

这是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为二叉树的高度。