C语言实验假设以二叉链作为存储结构,设计一个算法复制一棵二叉树。用相关数据进行测试。
时间: 2024-11-25 20:12:25 浏览: 8
在C语言中,复制一棵二叉树通常可以采用递归的方式,利用二叉链表的特性。首先,我们需要定义一个二叉链表节点的数据结构,包含两个指针(指向左孩子和右孩子),以及一个指向父节点的指针。以下是基本步骤:
1. 定义二叉链表节点结构体:
```c
typedef struct TreeNode {
int val; // 节点值
struct TreeNode* left; // 左子节点指针
struct TreeNode* right; // 右子节点指针
} TreeNode;
```
2. 写一个复制函数,它接受一个根节点作为输入,并返回新复制的树的根节点:
```c
TreeNode* copyTree(TreeNode* root) {
if (root == NULL) {
return NULL;
}
// 创建新节点并分配内存
TreeNode* newRoot = malloc(sizeof(TreeNode));
newRoot->val = root->val;
// 递归复制左右子树
newRoot->left = copyTree(root->left);
newRoot->right = copyTree(root->right);
return newRoot;
}
```
3. 测试示例:
为了测试这个算法,我们可以创建一些简单的二叉树实例,比如单节点、平衡树或完全不平衡的树,然后复制它们,比较原树和复制后的树是否一致。
```c
int main() {
// 创建一个简单的二叉树
TreeNode* originalRoot = (TreeNode*)malloc(sizeof(TreeNode));
originalRoot->val = 1;
originalRoot->left = (TreeNode*)malloc(sizeof(TreeNode));
originalRoot->left->val = 2;
originalRoot->left->left = NULL;
originalRoot->left->right = NULL;
originalRoot->right = NULL;
// 复制树
TreeNode* copiedRoot = copyTree(originalRoot);
// 检查复制结果
assert(copiedRoot != NULL && copiedRoot->val == 1);
assert(copiedRoot->left != NULL && copiedRoot->left->val == 2);
// ... 更详细的比较 ...
free(copiedRoot); // 别忘了释放复制后的树内存
return 0;
}
```
阅读全文