C语言实现二叉树算法(括号表示法的二叉树)1.创建二叉树(括号表示法)2.输出二叉树(括号表示法)3.输出某节点的右孩子4.输出某节点的左孩子5.输出二叉树的深度,6.输出二叉树的叶子节点个数,7.输出二叉树的先序遍历序列8.输出二叉树的中序遍历序列9.输出二叉树的后序遍历学历
时间: 2024-03-14 14:17:00 浏览: 100
利用C++实现二叉树的建立 首先通过建立节点类、然后通过递归算法建立整个二叉树,有增加、删除、查找等算法,有利于初步学习二叉树
以下是C语言实现二叉树算法的代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
char data;
struct Node* left;
struct Node* right;
} Node;
// 创建二叉树
Node* createTree(char* str, int* index) {
if(str[*index] == '\0') {
return NULL;
}
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = str[*index];
newNode->left = NULL;
newNode->right = NULL;
if(str[++(*index)] == '(') {
newNode->left = createTree(str, index);
++(*index);
}
if(str[++(*index)] == '(') {
newNode->right = createTree(str, index);
++(*index);
}
return newNode;
}
// 输出二叉树
void printTree(Node* root) {
if(root == NULL) {
return;
}
printf("%c", root->data);
if(root->left != NULL || root->right != NULL) {
printf("(");
printTree(root->left);
printf(",");
printTree(root->right);
printf(")");
}
}
// 输出某节点的右孩子
void printRightChild(Node* root, char ch) {
if(root == NULL) {
return;
}
if(root->data == ch && root->right != NULL) {
printf("%c", root->right->data);
return;
}
printRightChild(root->left, ch);
printRightChild(root->right, ch);
}
// 输出某节点的左孩子
void printLeftChild(Node* root, char ch) {
if(root == NULL) {
return;
}
if(root->data == ch && root->left != NULL) {
printf("%c", root->left->data);
return;
}
printLeftChild(root->left, ch);
printLeftChild(root->right, ch);
}
// 输出二叉树的深度
int getDepth(Node* root) {
if(root == NULL) {
return 0;
}
int leftDepth = getDepth(root->left);
int rightDepth = getDepth(root->right);
return 1 + (leftDepth > rightDepth ? leftDepth : rightDepth);
}
// 输出二叉树的叶子节点个数
int getLeafCount(Node* root) {
if(root == NULL) {
return 0;
}
if(root->left == NULL && root->right == NULL) {
return 1;
}
return getLeafCount(root->left) + getLeafCount(root->right);
}
// 输出二叉树的先序遍历序列
void preOrder(Node* root) {
if(root == NULL) {
return;
}
printf("%c ", root->data);
preOrder(root->left);
preOrder(root->right);
}
// 输出二叉树的中序遍历序列
void inOrder(Node* root) {
if(root == NULL) {
return;
}
inOrder(root->left);
printf("%c ", root->data);
inOrder(root->right);
}
// 输出二叉树的后序遍历序列
void postOrder(Node* root) {
if(root == NULL) {
return;
}
postOrder(root->left);
postOrder(root->right);
printf("%c ", root->data);
}
int main() {
char str[] = "A(B(D,E),C(F,G))";
int index = 0;
Node* root = createTree(str, &index);
printf("二叉树括号表示法:");
printTree(root);
printf("\n");
printf("节点'C'的右孩子:");
printRightChild(root, 'C');
printf("\n");
printf("节点'B'的左孩子:");
printLeftChild(root, 'B');
printf("\n");
printf("二叉树的深度:%d\n", getDepth(root));
printf("二叉树的叶子节点个数:%d\n", getLeafCount(root));
printf("二叉树的先序遍历序列:");
preOrder(root);
printf("\n");
printf("二叉树的中序遍历序列:");
inOrder(root);
printf("\n");
printf("二叉树的后序遍历序列:");
postOrder(root);
printf("\n");
return 0;
}
```
以上代码实现了创建二叉树、输出二叉树、输出某节点的右孩子、输出某节点的左孩子、输出二叉树的深度、输出二叉树的叶子节点个数、输出二叉树的先序遍历序列、输出二叉树的中序遍历序列、输出二叉树的后序遍历序列。
阅读全文