构造利用二叉链表存储表示的二叉树; (2)利用先序遍历创建一个二叉树; (3)递归计算二叉树的深度和叶子结点的个数。
时间: 2023-11-28 20:49:16 浏览: 104
1. 二叉链表存储表示的二叉树
在二叉链表存储结构中,一个二叉树节点包含三个域:数据域、左子树指针域和右子树指针域。其中,左子树指针域指向该节点的左子树根节点,右子树指针域指向该节点的右子树根节点。
下面是一个二叉树节点的结构体定义:
```
typedef struct TreeNode {
int data; // 数据域
struct TreeNode* left; // 左子树指针域
struct TreeNode* right; // 右子树指针域
} TreeNode;
```
2. 先序遍历创建二叉树
先序遍历创建二叉树的思路如下:
1. 从输入流中读取下一个字符。
2. 如果字符是空格或换行符,则返回空指针。
3. 否则,创建一个新节点,将字符转换为数字,并将其存储到节点的数据域中。
4. 递归创建节点的左子树。
5. 递归创建节点的右子树。
6. 返回新节点。
下面是一个实现先序遍历创建二叉树的函数:
```
TreeNode* create_tree() {
int val;
scanf("%d", &val);
if (val == -1) { // -1 表示空节点
return NULL;
}
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->data = val;
root->left = create_tree();
root->right = create_tree();
return root;
}
```
函数的返回值为二叉树的根节点。
3. 递归计算二叉树的深度和叶子结点的个数
递归计算二叉树的深度和叶子结点的个数的思路如下:
1. 对于空树,深度为 0,叶子结点个数为 0。
2. 对于非空树,深度为左右子树深度的较大值加 1,叶子结点个数为左右子树叶子结点个数之和。
下面是一个实现递归计算二叉树深度和叶子结点个数的函数:
```
void count(TreeNode* root, int* depth, int* leaves) {
if (root == NULL) {
*depth = 0;
*leaves = 0;
} else {
int ldepth, rdepth, lleaves, rleaves;
count(root->left, &ldepth, &lleaves);
count(root->right, &rdepth, &rleaves);
*depth = (ldepth > rdepth ? ldepth : rdepth) + 1;
*leaves = lleaves + rleaves;
if (root->left == NULL && root->right == NULL) {
*leaves += 1;
}
}
}
```
函数的参数为二叉树的根节点、深度和叶子结点个数。函数通过指针修改深度和叶子结点个数的值。
阅读全文