简答题 用先序遍历扩充二叉树创建一颗二叉树,并统计其叶子节点数和节点总数。c语音
时间: 2024-08-13 18:05:47 浏览: 45
建立二叉树,并输出二叉树的先序,中序和后序遍历序列,以及二叉树的叶子数
使用先序遍历(Preorder Traversal)创建二叉树并统计叶子节点和节点总数,可以通过递归的方式实现。下面是步骤和关键代码:
1. 先序遍历的顺序是:根节点 -> 左子树 -> 右子树。当遇到空节点时,停止递归。
2. 定义一个结构体或类来表示二叉树节点,包含一个值和两个指向左右子节点的指针。
```c
struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
};
```
3. 创建一个函数用于创建二叉树,输入是遍历序列。如果序列为空,返回空节点;否则,取出第一个元素作为根节点,然后递归地创建左右子树。
```c
struct TreeNode* createTree(int* preorder, int size) {
if (size == 0) return NULL;
struct TreeNode* root = malloc(sizeof(struct TreeNode));
root->val = preorder;
int index = 1; // 跟踪先序序列的位置
if (preorder[index] != -1) { // 如果右子节点存在
root->right = createTree(&preorder[index], size); // 递归创建右子树
index++;
}
if (index < size && preorder[index] != -1) { // 如果左子节点存在
root->left = createTree(&preorder[index], size); // 递归创建左子树
index++;
}
return root;
}
```
4. 在创建二叉树后,遍历二叉树来计算叶子节点和节点总数。叶子节点是没有子节点的节点,可以通过检查`left`和`right`是否为`NULL`来确定。节点总数就是递归调用的总次数加上根节点。
```c
int countLeavesAndNodes(struct TreeNode* root) {
int leafCount = 0, totalCount = 1; // 初始化叶子节点数和节点总数
if (root != NULL) {
if (root->left == NULL && root->right == NULL) leafCount++; // 检查当前节点是否是叶子
totalCount += countLeavesAndNodes(root->left) + countLeavesAndNodes(root->right);
}
return leafCount + totalCount;
}
```
阅读全文