用c语言实现(1)创建二叉树 (2)求二叉树的前序遍历序列 (3)求二叉树的中序遍历序列 (4)求二叉树的后序遍历序列 (5)求二叉树的层次遍历序列 (6)计算二叉树的深度 (7)统计二叉树中叶子结点的个数 (8)判断两棵树是否相等 (9)交换二叉树中每个结点的左孩子和右孩子 (10)复制二叉树要三百行
时间: 2023-10-13 09:06:12 浏览: 69
以下是使用 C 语言实现以上功能的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
/* 定义二叉树结点 */
typedef struct node {
char data;
struct node *lchild, *rchild;
} BiTNode, *BiTree;
/* 函数声明 */
void createBiTree(BiTree *T);
void preOrder(BiTree T);
void inOrder(BiTree T);
void postOrder(BiTree T);
void levelOrder(BiTree T);
int getDepth(BiTree T);
int countLeaf(BiTree T);
int isEqual(BiTree T1, BiTree T2);
void swapChild(BiTree T);
BiTree copyTree(BiTree T);
/* 主函数 */
int main() {
BiTree T1, T2, T3;
printf("请输入第一棵二叉树的结点数据,以空格分隔(#表示空结点):\n");
createBiTree(&T1);
printf("先序遍历结果为:");
preOrder(T1);
printf("\n中序遍历结果为:");
inOrder(T1);
printf("\n后序遍历结果为:");
postOrder(T1);
printf("\n层次遍历结果为:");
levelOrder(T1);
printf("\n二叉树的深度为:%d\n", getDepth(T1));
printf("二叉树中叶子结点的个数为:%d\n", countLeaf(T1));
printf("\n请输入第二棵二叉树的结点数据,以空格分隔(#表示空结点):\n");
createBiTree(&T2);
if (isEqual(T1, T2)) {
printf("两棵二叉树相等。\n");
} else {
printf("两棵二叉树不相等。\n");
}
printf("\n将第一棵二叉树的每个结点的左右孩子交换之后,层次遍历结果为:");
swapChild(T1);
levelOrder(T1);
printf("\n复制第一棵二叉树,得到的二叉树的层次遍历结果为:");
T3 = copyTree(T1);
levelOrder(T3);
return 0;
}
/* 创建二叉树 */
void createBiTree(BiTree *T) {
char c;
scanf("%c", &c);
if (c == '#') {
*T = NULL;
} else {
*T = (BiTree) malloc(sizeof(BiTNode));
(*T)->data = c;
createBiTree(&((*T)->lchild));
createBiTree(&((*T)->rchild));
}
}
/* 前序遍历 */
void preOrder(BiTree T) {
if (T != NULL) {
printf("%c ", T->data);
preOrder(T->lchild);
preOrder(T->rchild);
}
}
/* 中序遍历 */
void inOrder(BiTree T) {
if (T != NULL) {
inOrder(T->lchild);
printf("%c ", T->data);
inOrder(T->rchild);
}
}
/* 后序遍历 */
void postOrder(BiTree T) {
if (T != NULL) {
postOrder(T->lchild);
postOrder(T->rchild);
printf("%c ", T->data);
}
}
/* 层次遍历 */
void levelOrder(BiTree T) {
BiTree queue[MAX_SIZE];
int front = 0, rear = 0;
if (T != NULL) {
queue[rear++] = T;
while (front != rear) {
BiTree p = queue[front++];
printf("%c ", p->data);
if (p->lchild != NULL) {
queue[rear++] = p->lchild;
}
if (p->rchild != NULL) {
queue[rear++] = p->rchild;
}
}
}
}
/* 计算二叉树的深度 */
int getDepth(BiTree T) {
if (T == NULL) {
return 0;
} else {
int leftDepth = getDepth(T->lchild);
int rightDepth = getDepth(T->rchild);
return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
}
}
/* 统计二叉树中叶子结点的个数 */
int countLeaf(BiTree T) {
if (T == NULL) {
return 0;
} else if (T->lchild == NULL && T->rchild == NULL) {
return 1;
} else {
return countLeaf(T->lchild) + countLeaf(T->rchild);
}
}
/* 判断两棵树是否相等 */
int isEqual(BiTree T1, BiTree T2) {
if (T1 == NULL && T2 == NULL) {
return 1;
} else if (T1 != NULL && T2 != NULL) {
if (T1->data == T2->data) {
return isEqual(T1->lchild, T2->lchild) && isEqual(T1->rchild, T2->rchild);
} else {
return 0;
}
} else {
return 0;
}
}
/* 交换二叉树中每个结点的左孩子和右孩子 */
void swapChild(BiTree T) {
if (T != NULL) {
BiTree temp = T->lchild;
T->lchild = T->rchild;
T->rchild = temp;
swapChild(T->lchild);
swapChild(T->rchild);
}
}
/* 复制二叉树 */
BiTree copyTree(BiTree T) {
BiTree newTree = NULL;
if (T != NULL) {
newTree = (BiTree) malloc(sizeof(BiTNode));
newTree->data = T->data;
newTree->lchild = copyTree(T->lchild);
newTree->rchild = copyTree(T->rchild);
}
return newTree;
}
```
阅读全文