数组实现二叉树:删除含子树节点及剩余节点计数方法
数组实现二叉树的节点删除(含子树)与统计:用for循环实现方案
当然可以用for循环搞定这个需求!先明确咱们的数组二叉树规则:一般这种顺序存储是完全二叉树格式——索引为i的节点,左孩子是2*i+1,右孩子是2*i+2(从0开始索引,对应你代码里首元素是根的逻辑)。
下面给你拆解实现步骤,附完整代码:
核心思路
- 先定位要删除的目标节点,然后用for循环遍历标记它的所有子树节点
- 最后遍历数组统计未被标记的节点数量即可
完整实现代码
#include <iostream> #include <vector> using namespace std; int main() { int N; cout << "输入节点总数N: "; cin >> N; int A[100]; cout << "输入" << N << "个节点值: "; for (int i = 0; i < N; ++i) { cin >> A[i]; } int X; cout << "输入要删除的节点值X: "; cin >> X; // 第一步:找到目标节点的索引 int target_idx = -1; for (int i = 0; i < N; ++i) { if (A[i] == X) { target_idx = i; break; } } if (target_idx == -1) { cout << "未找到节点X,剩余节点数:" << N << endl; return 0; } // 标记要删除的节点集合 bool to_delete[100] = {false}; vector<int> process_list; process_list.push_back(target_idx); to_delete[target_idx] = true; // 用for循环遍历处理所有子树节点(替代递归) for (int i = 0; i < process_list.size(); ++i) { int curr_node = process_list[i]; int left_child = 2 * curr_node + 1; int right_child = 2 * curr_node + 2; // 左孩子存在则标记并加入处理列表 if (left_child < N && !to_delete[left_child]) { to_delete[left_child] = true; process_list.push_back(left_child); } // 右孩子存在则标记并加入处理列表 if (right_child < N && !to_delete[right_child]) { to_delete[right_child] = true; process_list.push_back(right_child); } } // 统计剩余节点数量 int remaining_count = 0; for (int i = 0; i < N; ++i) { if (!to_delete[i]) { remaining_count++; } } cout << "删除节点及其子树后,剩余节点数:" << remaining_count << endl; return 0; }
关键细节说明
- 用
vector<int> process_list来存需要处理的节点索引,通过for循环遍历这个列表,就能把目标节点的所有子节点都标记出来,完美替代递归逻辑 - 布尔数组
to_delete用来记录哪些节点要被删除,避免重复处理同一节点 - 如果你的节点值可能重复,可以调整查找逻辑(比如删除所有匹配X的节点,而不是第一个)
- 要是想直接修改原数组,可以把标记的位置设为特殊值(比如-1),之后统计非特殊值的元素数量,效果一致
内容的提问来源于stack exchange,提问作者Prem Raj
相关产品推荐
相关产品推荐

