运行给出的二叉树创建和遍历代码,在此基础上实现输出二叉树的叶子节点、二叉树的高度等。 编程实现二叉树非递归遍历算法。c语言
时间: 2024-10-28 10:03:51 浏览: 10
在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));
if (!newNode) {
printf("Memory allocation failed.\n");
return NULL;
}
newNode->val = val;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 插入节点到二叉树
void insert(TreeNode** root, int val) {
if (*root == NULL) {
*root = createNode(val);
} else if (val < (*root)->val) {
insert(&((*root)->left), val);
} else {
insert(&((*root)->right), val);
}
}
// 非递归遍历二叉树(前序遍历)
void preOrderTraversal(TreeNode* node) {
if (node != NULL) {
printf("%d ", node->val); // 先访问根
preOrderTraversal(node->left); // 然后左子树
preOrderTraversal(node->right); // 最后右子树
}
}
// 计算二叉树的高度
int height(TreeNode* root) {
if (root == NULL) {
return 0;
} else {
int leftHeight = height(root->left);
int rightHeight = height(root->right);
return (leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1);
}
}
// 找出并打印所有叶子节点
void printLeaves(TreeNode* node) {
if (node == NULL) {
return;
}
if (node->left == NULL && node->right == NULL) { // 如果节点是叶子节点
printf("%d ", node->val);
}
printLeaves(node->left);
printLeaves(node->right);
}
int main() {
// 示例操作:创建二叉树并插入一些值
TreeNode* root = NULL;
insert(&root, 5);
insert(&root, 3);
insert(&root, 7);
insert(&root, 2);
insert(&root, 4);
insert(&root, 6);
insert(&root, 8);
// 非递归遍历并打印结果
printf("Preorder traversal: ");
preOrderTraversal(root);
printf("\n");
// 打印叶子节点
printf("Leaf nodes: ");
printLeaves(root);
printf("\n");
// 计算并打印二叉树高度
int treeHeight = height(root);
printf("Tree height: %d\n", treeHeight);
return 0;
}
```
在这个例子中,我们首先创建了一个二叉树,然后通过`preOrderTraversal`函数进行了前序遍历。`height`函数用于计算树的高度,而`printLeaves`函数则用于找出并打印所有的叶子节点。在`main`函数里,我们对这些功能进行了测试。运行这个程序会输出相应的信息。如果你有任何问题或者需要帮助理解其中的某部分,请随时提问。
阅读全文