假设二叉树采用二叉链表存储结构存储。设计 一个算法按从左到右输出一棵二叉树中所有叶子结点值。写出二叉链表各个结点的类C语言描述。
时间: 2024-12-10 15:32:59 浏览: 88
当我们处理二叉树的链式存储结构时,每个节点通常包含三个部分:数据域用于存储节点的值,指向前驱节点的指针(left),以及指向后继节点的指针(right)。对于叶子节点(即没有子节点的节点),它们的right指针通常是NULL。以下是C语言中一个简单的二叉链表节点类的描述:
```c
// 定义二叉链表节点结构体
typedef struct Node {
int value; // 节点值
struct Node* left; // 左子节点指针
struct Node* right; // 右子节点指针
} TreeNode;
// 插入函数,这里只关注插入叶子节点的情况
void insertAsLeaf(TreeNode** root, int value) {
if (*root == NULL) {
*root = (TreeNode*)malloc(sizeof(TreeNode));
(*root)->value = value;
(*root)->left = NULL;
(*root)->right = NULL;
} else {
// 如果已有子节点,递归查找最后一个叶子节点并插入
insertAsLeaf(&(*root)->right, value);
}
}
// 遍历左子树并打印叶子节点
void printLeavesRecursively(TreeNode* node, bool isVisited[]) {
if (node == NULL || isVisited[node] == true) return;
isVisited[node] = true;
if (node->left == NULL && node->right == NULL) { // 判断是否为叶子节点
printf("%d ", node->value); // 打印节点值
}
printLeavesRecursively(node->left, isVisited);
printLeavesRecursively(node->right, isVisited);
}
// 主函数示例,创建一个空树然后插入叶子节点,并遍历输出
int main() {
TreeNode* root = NULL;
insertAsLeaf(&root, 1); // 插入节点1作为根节点
// ... 接着可以继续插入其他叶子节点
int visited[1000]; // 假设我们假设最大有1000个节点
for (int i = 0; i < 1000; i++) {
visited[i] = false;
}
printLeavesRecursively(root, visited);
return 0;
}
```
阅读全文