二叉树是一种常用的数据结构,它由若干个节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。本次实验旨在掌握二叉树的基本操作,包括创建二叉树、遍历二叉树和销毁二叉树。

一、创建二叉树

创建二叉树的方法有多种,本次实验采用先序遍历的方式构建二叉树。先序遍历的顺序是先遍历根节点,然后遍历左子树,最后遍历右子树。因此,我们可以通过递归的方式创建二叉树。具体代码如下:

#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode {
  int val;
  struct TreeNode* left;
  struct TreeNode* right;
} TreeNode;

TreeNode* createTree(int* nums, int size, int index) {
  if (index >= size || nums[index] == -1) {
    return NULL;
  }

  TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
  root->val = nums[index];
  root->left = createTree(nums, size, 2 * index + 1);
  root->right = createTree(nums, size, 2 * index + 2);

  return root;
}

int main() {
  int nums[] = {1, 2, 3, 4, -1, 5, 6};
  int size = sizeof(nums) / sizeof(int);
  TreeNode* root = createTree(nums, size, 0);
  return 0;
}

上述代码中,我们定义了一个结构体 TreeNode 来表示二叉树的节点。其中 val 表示节点的值,leftright 分别表示左右子节点。函数 createTree 接收一个整数数组 nums,数组中的元素按照先序遍历的顺序排列,-1 表示空节点。变量 size 表示数组的长度,index 表示当前节点在数组中的下标。如果当前节点为空节点,返回 NULL。否则,创建一个节点,并递归创建其左右子树,最后返回根节点。

二、遍历二叉树

遍历二叉树的方法有三种,分别是先序遍历、中序遍历和后序遍历。本次实验实现了先序遍历和中序遍历。具体代码如下:

void preOrder(TreeNode* root) {
  if (root == NULL) {
    return;
  }

  printf('%d ', root->val);
  preOrder(root->left);
  preOrder(root->right);
}

void inOrder(TreeNode* root) {
  if (root == NULL) {
    return;
  }

  inOrder(root->left);
  printf('%d ', root->val);
  inOrder(root->right);
}

上述代码中,函数 preOrderinOrder 分别实现了先序遍历和中序遍历。如果当前节点为空节点,返回。否则,先访问当前节点,再递归遍历其左右子树。其中,先序遍历是先遍历根节点,中序遍历是先遍历左子树。

三、销毁二叉树

销毁二叉树的方法是先释放其左右子树,再释放根节点。具体代码如下:

void destroyTree(TreeNode* root) {
  if (root == NULL) {
    return;
  }

  destroyTree(root->left);
  destroyTree(root->right);
  free(root);
}

上述代码中,函数 destroyTree 接收一个根节点,先递归销毁其左右子树,最后释放根节点。

完整代码如下:

#include <stdio.h>
#include <stdlib.h>

typedef struct TreeNode {
  int val;
  struct TreeNode* left;
  struct TreeNode* right;
} TreeNode;

TreeNode* createTree(int* nums, int size, int index) {
  if (index >= size || nums[index] == -1) {
    return NULL;
  }

  TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
  root->val = nums[index];
  root->left = createTree(nums, size, 2 * index + 1);
  root->right = createTree(nums, size, 2 * index + 2);

  return root;
}

void preOrder(TreeNode* root) {
  if (root == NULL) {
    return;
  }

  printf('%d ', root->val);
  preOrder(root->left);
  preOrder(root->right);
}

void inOrder(TreeNode* root) {
  if (root == NULL) {
    return;
  }

  inOrder(root->left);
  printf('%d ', root->val);
  inOrder(root->right);
}

void destroyTree(TreeNode* root) {
  if (root == NULL) {
    return;
  }

  destroyTree(root->left);
  destroyTree(root->right);
  free(root);
}

int main() {
  int nums[] = {1, 2, 3, 4, -1, 5, 6};
  int size = sizeof(nums) / sizeof(int);
  TreeNode* root = createTree(nums, size, 0);

  printf("Preorder traversal: ");
  preOrder(root);
  printf("\n");

  printf("Inorder traversal: ");
  inOrder(root);
  printf("\n");

  destroyTree(root);
  return 0;
}

上述代码中,我们先创建一个二叉树,然后分别进行先序遍历和中序遍历。最后,销毁二叉树。运行结果如下:

Preorder traversal: 1 2 4 3 5 6 
Inorder traversal: 4 2 1 5 3 6 

综上所述,本次实验通过C语言实现了二叉树的创建、遍历和销毁。这些操作是二叉树基本操作,也是其他高级操作的基础。掌握了这些基本操作,我们可以更好地理解和应用二叉树。

C语言实现二叉树的创建、遍历和销毁实验报告

原文地址: https://www.cveoy.top/t/topic/n7Jo 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录