运行给出的二叉树创建和遍历代码,在此基础上实现输出二叉树的叶子节点、二叉树的高度等。 编程实现二叉树非递归遍历算法。 c语言
时间: 2024-10-28 22:03:54 浏览: 17
二叉树的创建与遍历C语言实现代码.zip
在C语言中,我们可以先定义一个简单的二叉树结构体,然后实现非递归遍历算法(如前序遍历、中序遍历和后序遍历),以及计算叶子节点和高度的方法。下面是一个基础的实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 创建新节点
TreeNode* createNode(int val) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
newNode->val = val;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 插入节点到二叉搜索树(这里为了简单,假设输入值总是可以插入)
TreeNode* insertIntoBST(TreeNode* root, int val) {
if (root == NULL) {
return createNode(val);
}
if (val < root->val) {
root->left = insertIntoBST(root->left, val);
} else {
root->right = insertIntoBST(root->right, val);
}
return root;
}
// 非递归前序遍历
void preOrderTraversal(TreeNode* root) {
if (root != NULL) {
printf("%d ", root->val); // 访问根节点
preOrderTraversal(root->left); // 遍历左子树
preOrderTraversal(root->right); // 遍历右子树
}
}
// 非递归中序遍历
void inOrderTraversal(TreeNode* root) {
if (root != NULL) {
inOrderTraversal(root->left); // 遍历左子树
printf("%d ", root->val); // 访问根节点
inOrderTraversal(root->right); // 遍历右子树
}
}
// 非递归后序遍历
void postOrderTraversal(TreeNode* root) {
if (root != NULL) {
postOrderTraversal(root->left); // 遍历左子树
postOrderTraversal(root->right); // 遍历右子树
printf("%d ", root->val); // 访问根节点
}
}
// 检查是否是叶子节点
int isLeaf(TreeNode* node) {
return node->left == NULL && node->right == NULL;
}
// 计算二叉树的高度
int height(TreeNode* root) {
if (root == NULL) {
return 0;
}
int leftHeight = height(root->left);
int rightHeight = height(root->right);
return (leftHeight > rightHeight ? leftHeight : rightHeight) + 1;
}
int main() {
// 示例:创建并遍历一棵简单的二叉树
TreeNode* root = NULL;
root = insertIntoBST(root, 5);
insertIntoBST(root, 3);
insertIntoBST(root, 7);
insertIntoBST(root, 2);
insertIntoBST(root, 4);
insertIntoBST(root, 6);
insertIntoBST(root, 8);
printf("前序遍历: ");
preOrderTraversal(root);
printf("\n");
printf("中序遍历: ");
inOrderTraversal(root);
printf("\n");
printf("后序遍历: ");
postOrderTraversal(root);
printf("\n");
printf("叶节点数量: ");
int leafCount = 0;
for (TreeNode* node = root; node != NULL; node = node->right) {
if (isLeaf(node)) {
leafCount++;
}
}
printf("%d\n", leafCount);
printf("树的高度: %d\n", height(root));
return 0;
}
```
在这个例子中,我们首先定义了一个二叉树节点结构,接着实现了插入节点、前序、中序和后序遍历,检查叶子节点以及计算树高。在`main`函数中,我们构建了一个示例二叉树,并展示了如何使用这些函数。运行这段代码,你可以看到二叉树的遍历结果和相关信息。
阅读全文