用扩展的先序遍历序列创建二叉链表(AB.DF..G..C.E.H..),输出并统计该二叉树的叶子节点,并注明遍历顺序。 用C语言写
时间: 2024-11-29 11:35:59 浏览: 0
在C语言中,我们可以使用递归的方式结合先序遍历序列来构建二叉链表,并统计叶子节点。先序遍历的顺序通常是“根-左-右”,即A-B-D-E-C-F-G-H。我们首先假设有一个结构体`Node`表示二叉链表的节点:
```c
typedef struct Node {
char data;
struct Node* left;
struct Node* right;
} TreeNode;
```
接着,我们可以编写一个函数来根据先序遍历序列建立链表:
```c
TreeNode* buildTree(char* preorder) {
if (preorder[0] == '\0') { // 遍历结束
return NULL;
}
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->data = preorder[0];
int index = 1; // 指向下一个字符的位置
// 查找右子节点
for (TreeNode* node = root; node && preorder[index]; ++index) {
if (preorder[index] == '.') { // 找到空格,意味着左子树结束
break;
}
node->right = buildTree(&preorder[index + 1]);
}
// 如果找到了右子节点,现在处理左子树
if (node->right) {
index += 1; // 跳过右子节点后的 '.'
node->left = buildTree(&preorder[index]);
}
return root;
}
```
最后,我们需要一个辅助函数来检查是否为叶子节点并统计它们的数量:
```c
int countLeaves(TreeNode* root) {
if (!root) {
return 0;
}
if (!root->left && !root->right) { // 叶子节点条件
return 1;
} else {
return countLeaves(root->left) + countLeaves(root->right);
}
}
```
为了输出整个链表,你可以添加一个遍历函数,如前序遍历:
```c
void inOrderTraversal(TreeNode* root) {
if (root) {
inOrderTraversal(root->left);
printf("%c", root->data); // 输出节点数据
inOrderTraversal(root->right);
}
}
int main() {
char preorder[] = "A.B.D.F.G...C.E.H...";
TreeNode* tree = buildTree(preorder);
printf("Preorder traversal: ");
inOrderTraversal(tree);
printf("\nNumber of leaf nodes: %d\n", countLeaves(tree));
free(tree); // 释放内存
return 0;
}
```
注意:这个代码示例假设输入字符串中的每个字符都代表一个节点,"." 表示当前层级的结束,实际应用中你需要根据实际情况调整解析逻辑。
阅读全文