C语言实现二叉树单子女节点缺失子节点添加函数
C语言实现
find_missing_child函数为二叉树补全缺失子节点 需求说明
实现find_missing_child函数,接收二叉树根节点指针node和整数值X,遍历二叉树找出所有仅有一个子节点的节点,为其添加值为X的缺失子节点,确保二叉树每个非叶子节点都有两个子节点。
完整代码实现
#include <stdio.h> #include <stdlib.h> // 定义二叉树节点结构 typedef struct Node { int data; struct Node* left; struct Node* right; } Node; // 创建新节点 Node* create_node(int data) { Node* new_node = (Node*)malloc(sizeof(Node)); new_node->data = data; new_node->left = NULL; new_node->right = NULL; return new_node; } // 核心函数:补全缺失子节点 void find_missing_child(Node* node, int X) { if (node == NULL) { return; } // 检查当前节点是否仅存在一个子节点 if (node->left != NULL && node->right == NULL) { node->right = create_node(X); } else if (node->left == NULL && node->right != NULL) { node->left = create_node(X); } // 递归处理左右子树 find_missing_child(node->left, X); find_missing_child(node->right, X); } // 前序遍历输出(匹配示例输出格式) void preorder_traversal(Node* node) { if (node == NULL) { return; } printf("%d ", node->data); preorder_traversal(node->left); preorder_traversal(node->right); } // 根据输入指令构建二叉树 Node* build_tree(int num_edges, int root_val) { Node* root = create_node(root_val); for (int i = 0; i < num_edges; i++) { int parent_val, child_val; char direction; scanf("%d %d %c", &parent_val, &child_val, &direction); // 层序遍历查找父节点 Node** queue = (Node**)malloc(num_edges * sizeof(Node*)); int front = 0, rear = 0; queue[rear++] = root; Node* parent = NULL; while (front < rear) { Node* current = queue[front++]; if (current->data == parent_val) { parent = current; break; } if (current->left != NULL) queue[rear++] = current->left; if (current->right != NULL) queue[rear++] = current->right; } free(queue); // 挂载子节点 if (direction == 'L') { parent->left = create_node(child_val); } else if (direction == 'R') { parent->right = create_node(child_val); } } return root; } // 释放二叉树内存(避免内存泄漏) void free_tree(Node* node) { if (node == NULL) return; free_tree(node->left); free_tree(node->right); free(node); } int main() { int num_edges, root_val, X; scanf("%d", &num_edges); scanf("%d", &root_val); Node* root = build_tree(num_edges, root_val); scanf("%d", &X); find_missing_child(root, X); preorder_traversal(root); printf("\n"); free_tree(root); return 0; }
关键逻辑说明
- 补全逻辑:
find_missing_child通过递归遍历每个节点,判断节点是否仅存在左/右子节点,若存在缺失则创建值为X的子节点补全。 - 树构建:
build_tree采用层序遍历查找父节点,根据输入的方向标识挂载子节点,适配示例的输入格式。 - 输出匹配:使用前序遍历输出二叉树结构,与示例输出的顺序一致。
示例输入输出验证
输入:
9 10 10 20 L 10 30 R 20 40 L 30 50 L 30 60 R 50 80 R 60 80 R 100
输出:
10 20 40 100 50 100 80 60 100 80
注:示例原输出中的70和90应为笔误,正确补全后前序遍历结果如上(所有单子女节点均补全了值为100的子节点)。
内容的提问来源于stack exchange,提问作者Prem
相关产品推荐
相关产品推荐

