1)实现:基于先序遍历思想实现二叉链表的创建 2)输出二叉树先序、中序和后序遍历的结果 3) 统计二叉树的叶结点个数 4)统计二叉树的高度 5)判断两棵二叉树是否相等 c语言
时间: 2024-11-15 07:27:35 浏览: 0
建立二叉树,并输出二叉树的先序,中序和后序遍历序列,以及二叉树的叶子数
1. 实现二叉链表的创建,通常采用递归的方式进行先序遍历。首先,创建一个结构体表示节点,包括值和指向左右子节点的指针。然后,对于每个节点,在先序遍历的过程中,先访问根节点,再递归地对左子树和右子树进行同样的操作。
```c
struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
};
// 创建函数
void createTree(struct TreeNode** root, int arr[], int start, int end) {
if (start > end) return;
struct TreeNode* node = malloc(sizeof(struct TreeNode));
node->val = arr[start];
node->left = NULL;
node->right = NULL;
// 遍历数组,找到中间位置作为根节点
int mid = (start + end) / 2;
node->left = createTree(root, arr, start, mid - 1);
node->right = createTree(root, arr, mid + 1, end);
*root = node;
}
```
2. 输出二叉树的遍历结果:
- 先序遍历:`void preorder(struct TreeNode* root)`,从根开始,递归地左子树 -> 根 -> 右子树。
- 中序遍历:`void inorder(struct TreeNode* root)`,递归地左子树 -> 根 -> 右子树。
- 后序遍历:`void postorder(struct TreeNode* root)`,递归地左子树 -> 右子树 -> 根。
3. 统计叶结点个数:可以设计一个辅助函数,检查当前节点是否为叶结点,然后递归计算。
```c
int countLeaves(struct TreeNode* root) {
if (!root) return 0;
if (!root->left && !root->right) return 1;
return countLeaves(root->left) + countLeaves(root->right);
}
```
4. 统计二叉树的高度:可以使用递归的方式,每次比较左子树和右子树的最大高度加一。
```c
int height(struct TreeNode* root) {
if (!root) return 0;
return 1 + max(height(root->left), height(root->right));
}
```
5. 判断两棵二叉树是否相等:需要同时比较每棵树的节点值、左子树和右子树是否都相等。
```c
int isSameTree(struct TreeNode* p, struct TreeNode* q) {
if (!p && !q) return 1;
if (!p || !q) return 0;
return (p->val == q->val) && isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
```
阅读全文