删除节点

本文通过一个具体的例子展示了如何使用jQuery进行DOM元素的添加、插入及删除操作。包括使用after和before方法来添加新的元素,以及利用remove和empty方法来删除指定的DOM节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title></title>

<style type="text/css">

</style>

<script src="js/jquery-2.1.3.min.js" type="text/javascript" charset="utf-8"></script>

<script type="text/javascript">

$(document).ready(function(){

$("#btn").click(function(){

$("ul").after("<div>after的div</div>");

$("<div>after的div</div>").insertAfter("ul");

$("ul").before("<div>before的div</div>");

// 删除dom节点 删除节点及其子元素

$("li:first").remove();

// 删除DOM节点 删除子元素不删除自己 empty

$("li:last").empty();

})

})

</script>

</head>

<body>

<input type="button" name="btn" id="btn" value="after/before" />

<ul>

<li>111</li>

<li>222</li>

</ul>

</body>

</html>

<think>我们参考引用[2]和引用[4]中关于二叉树节点删除的方法,特别是引用[2]详细描述了删除节点的三种情况,引用[4]提供了递归实现的代码。 删除节点需要考虑三种情况: 1. 被删除节点是叶子节点(无子节点):直接删除。 2. 被删除节点只有一个子节点:用其子节点替代。 3. 被删除节点有两个子节点:找到右子树的最小节点(或左子树的最大节点)的值复制到当前节点,然后删除那个最小(或最大)节点(此时该节点最多只有一个子节点,可转化为前两种情况)。 我们将实现一个非递归版本和一个递归版本的删除操作。假设我们的二叉树节点结构如下(参考引用[3]): ```cpp struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {} TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} }; ``` 我们以二叉搜索树(BST)为例,因为二叉搜索树有明确的节点值大小关系,删除时需要保持BST的性质。 非递归删除方法步骤: 1. 首先找到要删除节点及其父节点(因为需要修改父节点的指针)。 2. 根据节点的子节点情况处理: a. 无子节点:父节点指向该节点的指针置为nullptr。 b. 只有一个子节点:父节点指向该节点的指针指向该节点的子节点。 c. 有两个子节点:找到右子树的最小节点(或左子树的最大节点),记录其值,然后递归删除该最小节点,并将当前节点的值替换为最小节点的值。 递归删除方法(参考引用[4]): 使用递归可以避免显式记录父节点,通过引用传递节点指针。 我们分别实现这两种方法。 注意:在非递归方法中,如果要删除的是根节点,需要特殊处理(或者使用指向指针的指针)。 下面我们给出代码实现:</think>### C++二叉树节点删除实现详解 在二叉树中删除节点需要处理三种情况,确保删除后仍保持树结构的完整性[^2]。以下是基于二叉搜索树(BST)的节点删除实现方法: #### 节点结构定义 ```cpp struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} }; ``` #### 删除操作实现 ```cpp TreeNode* deleteNode(TreeNode* root, int key) { if (!root) return nullptr; // 空树处理 // 1. 查找目标节点 if (key < root->val) { root->left = deleteNode(root->left, key); } else if (key > root->val) { root->right = deleteNode(root->right, key); } else { // 2. 找到目标节点后的删除逻辑 // 情况1: 无子节点或单子节点 if (!root->left) { TreeNode* temp = root->right; delete root; return temp; } else if (!root->right) { TreeNode* temp = root->left; delete root; return temp; } // 情况2: 双子节点(替换法) TreeNode* successor = root->right; while (successor->left) { successor = successor->left; // 找右子树最小节点 } root->val = successor->val; // 值替换 root->right = deleteNode(root->right, successor->val); // 删除后继节点 } return root; } ``` #### 关键处理逻辑 1. **叶子节点**:直接删除,父节点指针置空 ```cpp // 示例:删除节点5 parent->left = nullptr; // 或 parent->right delete node; ``` 2. **单子节点**:子节点替代被删节点位置 ```cpp // 示例:删除只有左子树的节点 parent->left = node->left; // 孙子变儿子 delete node; ``` 3. **双子节点**(核心难点): - 找到右子树最小节点(或左子树最大节点) - 复制其值到被删节点 - 递归删除该后继节点 ```cpp // 替换值后删除后继节点 node->val = successor->val; node->right = deleteNode(node->right, successor->val); ``` #### 时间复杂度分析 - 平均情况:$O(\log n)$(平衡二叉树) - 最坏情况:$O(n)$(退化成链表) #### 注意事项 1. 内存管理:删除后及时释放节点内存 2. 平衡性:频繁删除可能破坏BST平衡性,可考虑AVL/红黑树 3. 特殊处理:根节点删除需要更新树根指针 > 示例:删除节点6(双子节点情况) > 1. 找到右子树最小节点7 > 2. 将6的值替换为7 > 3. 在右子树中递归删除节点7 > > 最终树结构保持二叉搜索树性质[^2][^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值