1创建二叉树
2创建的二叉树以树状形式输出
3分别以先序,中序,后序,三钟遍历方式访问二叉树
4输出二叉树中的叶子结点以及叶子结点个数
5输出二叉树高度
以下是一个简单的C语言程序,用于创建二叉树并实现所需的操作。程序基于递归实现二叉树的各种操作。
#include <stdio.h>
#include <stdlib.h>
// 二叉树结构体
struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
};
// 创建二叉树
struct TreeNode* createBinaryTree() {
int val;
struct TreeNode* node = NULL;
printf("Enter value (or -1 for no node): ");
scanf("%d", &val);
if (val == -1) {
return NULL;
} else {
node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
node->val = val;
node->left = createBinaryTree();
node->right = createBinaryTree();
return node;
}
}
// 以树状形式输出二叉树
void printBinaryTree(struct TreeNode* root, int space) {
if (root == NULL) {
return;
}
space += 10;
printBinaryTree(root->right, space);
printf("\n");
for (int i = 10; i < space; i++) {
printf(" ");
}
printf("%d\n", root->val);
printBinaryTree(root->left, space);
}
// 先序遍历二叉树
void preOrderTraversal(struct TreeNode* root) {
if (root == NULL) {
return;
}
printf("%d ", root->val);
preOrderTraversal(root->left);
preOrderTraversal(root->right);
}
// 中序遍历二叉树
void inOrderTraversal(struct TreeNode* root) {
if (root == NULL) {
return;
}
inOrderTraversal(root->left);
printf("%d ", root->val);
inOrderTraversal(root->right);
}
// 后序遍历二叉树
void postOrderTraversal(struct TreeNode* root) {
if (root == NULL) {
return;
}
postOrderTraversal(root->left);
postOrderTraversal(root->right);
printf("%d ", root->val);
}
// 计算叶子结点数量
int countLeaves(struct TreeNode* root) {
if (root == NULL) {
return 0;
} else if (root->left == NULL && root->right == NULL) {
return 1;
} else {
return countLeaves(root->left) + countLeaves(root->right);
}
}
// 输出叶子结点
void printLeaves(struct TreeNode* root) {
if (root == NULL) {
return;
} else if (root->left == NULL && root->right == NULL) {
printf("%d ", root->val);
} else {
printLeaves(root->left);
printLeaves(root->right);
}
}
// 计算二叉树高度
int getHeight(struct TreeNode* root) {
if (root == NULL) {
return 0;
} else {
int leftHeight = getHeight(root->left);
int rightHeight = getHeight(root->right);
return (leftHeight > rightHeight) ? leftHeight + 1 : rightHeight + 1;
}
}
// 主函数
int main() {
struct TreeNode* root;
int choice;
// 创建二叉树
root = createBinaryTree();
// 输出二叉树
printBinaryTree(root, 0);
// 遍历二叉树
printf("Enter type of traversal: (1) Preorder, (2) Inorder, (3) Postorder\n");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("Preorder traversal: ");
preOrderTraversal(root);
break;
case 2:
printf("Inorder traversal: ");
inOrderTraversal(root);
break;
case 3:
printf("Postorder traversal: ");
postOrderTraversal(root);
break;
default:
printf("Invalid choice.\n");
break;
}
printf("\n");
// 输出叶子结点及数量
printf("Leaves: ");
printLeaves(root);
printf("\nNumber of leaves: %d\n", countLeaves(root));
// 计算二叉树高度
printf("Height of the tree: %d\n", getHeight(root));
return 0;
}
在这个程序中,首先定义了一个结构体来表示二叉树节点,包括整数val,以及左右子节点指针left和right。使用createBinaryTree函数创建二叉树,printBinaryTree函数以树状形式输出二叉树。
然后实现了三种遍历方式:preOrderTraversal函数实现先序遍历,inOrderTraversal函数实现中序遍历,postOrderTraversal函数实现后序遍历。还实现了两个用于叶子结点的操作,countLeaves函数用于计算叶子结点数量,printLeaves函数用于输出叶子结点。
getHeight函数用于计算二叉树高度。主函数中,使用switch语句可以让用户选择遍历方式,然后输出遍历结果,叶子结点和数量以及二叉树高度。
此文章用c语言实现了二叉树的基本操作,包括先序创建二叉树,先序、中序、后序遍历二叉树,计算叶子节点的个数以及输出叶子节点,求二叉树的深度
二叉树的创建可以通过链式存储结构实现,我们可以定义一个二叉树的结构体来表示每个节点的信息,同时通过指针将左右子树链接起来。以下是一个简单的二叉树结构体的定义:
struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
};
对于每个节点,我们需要手动创建一个该结构体的实例,并进行赋值操作,构建出一颗符合要求的二叉树。
以下是一个示例代码,实现创建一颗二叉树:
#include <stdio.h>
#include <stdlib.h>
struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
};
struct TreeNode* createTree(int val)
{
struct TreeNode* node = (struct TreeNode*) malloc(sizeof(struct TreeNode));
node->val = val;
node->left = NULL;
node->right = NULL;
return node;
}
int main()
{
// 构建一个简单的二叉树
struct TreeNode* root = createTree(1);
root->left = createTree(2);
root->right = createTree(3);
return 0;
}
为了以树状形式输出已创建的二叉树,我们可以使用递归算法对二叉树进行深度优先遍历(DFS),并在遍历的过程中将每个节点的信息输出到控制台上,同时通过控制缩进的方式来表示节点之间的层次关系。具体而言,对于每个节点,我们先输出该节点的值,然后分别对左右子树进行递归调用,并在递归前增加一定缩进,递归完成后再恢复缩进,以此体现出二叉树的层次关系。
以下是一个示例代码,实现树状输出已创建的二叉树:
#include <stdio.h>
#include <stdlib.h>
struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
};
struct TreeNode* createTree(int val)
{
struct TreeNode* node = (struct TreeNode*) malloc(sizeof(struct TreeNode));
node->val = val;
node->left = NULL;
node->right = NULL;
return node;
}
void printTree(struct TreeNode* root, int depth)
{
if (root == NULL) {
return;
}
// 缩进实现层次结构
for (int i = 0; i < depth; i++) {
printf(" ");
}
printf("%d\n", root->val);
printTree(root->left, depth + 1);
printTree(root->right, depth + 1);
}
int main()
{
// 构建一个简单的二叉树
struct TreeNode* root = createTree(1);
root->left = createTree(2);
root->right = createTree(3);
// 树状形式输出已创建的二叉树
printTree(root, 0);
return 0;
}
对于先序、中序和后序遍历方式,我们同样可以使用递归算法对二叉树进行深度优先遍历,并在遍历的过程中对每个节点进行相应的操作。具体而言,对于先序遍历,我们先输出当前节点的值,再分别对左右子树进行遍历。对于中序遍历,我们先对左子树进行遍历,再输出当前节点的值,最后对右子树进行遍历。对于后序遍历,我们先对左右子树进行遍历,再输出当前节点的值。
以下是一个示例代码,实现分别以先序、中序和后序遍历方式访问已创建的二叉树:
#include <stdio.h>
#include <stdlib.h>
struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
};
struct TreeNode* createTree(int val)
{
struct TreeNode* node = (struct TreeNode*) malloc(sizeof(struct TreeNode));
node->val = val;
node->left = NULL;
node->right = NULL;
return node;
}
// 先序遍历
void preorderTraversal(struct TreeNode* root)
{
if (root == NULL) {
return;
}
printf("%d ", root->val);
preorderTraversal(root->left);
preorderTraversal(root->right);
}
// 中序遍历
void inorderTraversal(struct TreeNode* root)
{
if (root == NULL) {
return;
}
inorderTraversal(root->left);
printf("%d ", root->val);
inorderTraversal(root->right);
}
// 后序遍历
void postorderTraversal(struct TreeNode* root)
{
if (root == NULL) {
return;
}
postorderTraversal(root->left);
postorderTraversal(root->right);
printf("%d ", root->val);
}
int main()
{
// 构建一个简单的二叉树
struct TreeNode* root = createTree(1);
root->left = createTree(2);
root->right = createTree(3);
// 分别以先序、中序和后序遍历方式访问已创建的二叉树
printf("Preorder traversal: ");
preorderTraversal(root);
printf("\n");
printf("Inorder traversal: ");
inorderTraversal(root);
printf("\n");
printf("Postorder traversal: ");
postorderTraversal(root);
printf("\n");
return 0;
}
对于输出已创建的二叉树中的叶子结点,我们同样可以使用递归算法对二叉树进行深度优先遍历,并在遍历的过程中判断当前节点是否为叶子节点,如果是则输出该节点的值。对于统计叶子结点的个数,我们可以在输出的过程中对计数器进行累加操作。
以下是一个示例代码,实现输出已创建的二叉树中的叶子节点以及叶子节点的个数:
#include <stdio.h>
#include <stdlib.h>
struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
};
struct TreeNode* createTree(int val)
{
struct TreeNode* node = (struct TreeNode*) malloc(sizeof(struct TreeNode));
node->val = val;
node->left = NULL;
node->right = NULL;
return node;
}
// 输出叶子节点
void printLeaves(struct TreeNode* root, int* count)
{
if (root == NULL) {
return;
}
if (root->left == NULL && root->right == NULL) {
printf("%d ", root->val);
(*count)++;
}
printLeaves(root->left, count);
printLeaves(root->right, count);
}
int main()
{
// 构建一个简单的二叉树
struct TreeNode* root = createTree(1);
root->left = createTree(2);
root->right = createTree(3);
root->left->left = createTree(4);
root->left->right = createTree(5);
root->right->left = createTree(6);
root->right->right = createTree(7);
// 输出已创建的二叉树中的叶子节点并统计叶子节点个数
int count = 0;
printf("Leaves: ");
printLeaves(root, &count);
printf("\n");
printf("Leaf count: %d\n", count);
return 0;
}
对于计算二叉树的高度,我们同样可以使用递归算法对二叉树进行深度优先遍历,并在遍历的过程中记录当前节点的深度。对于每个节点,我们先对左右子树进行递归遍历,分别求得左右子树的深度,然后取两者较大值,再加上1(当前节点的深度),即可得到该节点所在的子树的深度。对于根节点,我们从0开始计算,即树的高度为其根节点的深度。
以下是一个示例代码,实现计算已创建的二叉树的高度:
#include <stdio.h>
#include <stdlib.h>
struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
};
struct TreeNode* createTree(int val)
{
struct TreeNode* node = (struct TreeNode*) malloc(sizeof(struct TreeNode));
node->val = val;
node->left = NULL;
node->right = NULL;
return node;
}
// 递归计算树的高度
int getHeight(struct TreeNode* root)
{
if (root == NULL) {
return -1;
}
int leftHeight = getHeight(root->left);
int rightHeight = getHeight(root->right);
return (leftHeight > rightHeight ? leftHeight : rightHeight) + 1;
}
int main()
{
// 构建一个简单的二叉树
struct TreeNode* root = createTree(1);
root->left = createTree(2);
root->right = createTree(3);
root->left->left = createTree(4);
root->left->right = createTree(5);
root->right->left = createTree(6);
root->right->right = createTree(7);
// 计算已创建的二叉树的高度
int height = getHeight(root);
printf("Tree height: %d\n", height);
return 0;
}