、c语言 二叉树 任务:建立二叉树,并实现二叉树的遍历以及求根结点到指定结点的路径。 功能要求: 1) 建立二叉树存储结构; 2) 对二叉树进行先序、中序、后序、层序遍历,并输出对应遍历序列; 3) 求根结点到指定结点的路径。 界面要求:程序运行后,给出菜单项的内容和输入提示: 1. 建立二叉树存储结构 2. 求二叉树的先序遍历序列 3. 求二叉树的中序遍历序列 4. 求二叉树的后序遍历序列 5. 求二叉树的层序遍历序列 6. 求根结点到指定结点的路径 0. 退出 请选择0-5:
时间: 2024-03-18 08:42:19 浏览: 14
好的,以下是一个基本的C语言二叉树程序,包括建立二叉树存储结构、二叉树的先序遍历、中序遍历、后序遍历、层序遍历以及求根节点到指定节点的路径。请注意,此程序是基于静态数组实现的,因此在实际应用中可能会受到内存大小的限制。
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 // 定义静态数组大小
#define ElemType char // 定义树节点类型为字符型
typedef struct Node{ // 树节点结构体
ElemType data; // 数据域
struct Node *lchild, *rchild; // 左右子树指针
} Node, *pNode;
int createTree(pNode *root); // 建立二叉树
void preOrder(pNode root); // 先序遍历
void inOrder(pNode root); // 中序遍历
void postOrder(pNode root); // 后序遍历
void levelOrder(pNode root); // 层序遍历
int getPath(pNode root, ElemType target, pNode path[], int *len); // 求根节点到指定节点的路径
int main(){
pNode root = NULL;
int choice, len;
pNode path[MAXSIZE];
while(1){
printf("---------------------\n");
printf("1. 建立二叉树存储结构\n");
printf("2. 求二叉树的先序遍历序列\n");
printf("3. 求二叉树的中序遍历序列\n");
printf("4. 求二叉树的后序遍历序列\n");
printf("5. 求二叉树的层序遍历序列\n");
printf("6. 求根结点到指定结点的路径\n");
printf("0. 退出\n");
printf("---------------------\n");
printf("请选择0-6:");
scanf("%d", &choice);
switch(choice){
case 1:
createTree(&root);
break;
case 2:
printf("先序遍历序列:");
preOrder(root);
printf("\n");
break;
case 3:
printf("中序遍历序列:");
inOrder(root);
printf("\n");
break;
case 4:
printf("后序遍历序列:");
postOrder(root);
printf("\n");
break;
case 5:
printf("层序遍历序列:");
levelOrder(root);
printf("\n");
break;
case 6:
printf("请输入要查找的节点:");
ElemType target;
scanf(" %c", &target);
len = 0;
if(getPath(root, target, path, &len)){
printf("根节点到节点%c的路径为:", target);
for(int i = 0; i < len-1; i++){
printf("%c->", path[i]->data);
}
printf("%c\n", path[len-1]->data);
}
else{
printf("未找到节点%c\n", target);
}
break;
case 0:
exit(0);
default:
printf("输入错误,请重新选择!\n");
}
}
return 0;
}
int createTree(pNode *root){
ElemType data;
printf("请输入节点数据(#代表空节点):");
scanf(" %c", &data);
if(data == '#'){ // 空节点
*root = NULL;
}
else{
*root = (pNode)malloc(sizeof(Node)); // 动态分配节点空间
if(!(*root)){ // 内存分配失败
printf("内存分配失败!\n");
exit(-1);
}
(*root)->data = data; // 存储节点数据
createTree(&((*root)->lchild)); // 递归建立左子树
createTree(&((*root)->rchild)); // 递归建立右子树
}
return 1;
}
void preOrder(pNode root){
if(root){ // 节点不为空
printf("%c ", root->data); // 输出节点数据
preOrder(root->lchild); // 递归遍历左子树
preOrder(root->rchild); // 递归遍历右子树
}
}
void inOrder(pNode root){
if(root){ // 节点不为空
inOrder(root->lchild); // 递归遍历左子树
printf("%c ", root->data); // 输出节点数据
inOrder(root->rchild); // 递归遍历右子树
}
}
void postOrder(pNode root){
if(root){ // 节点不为空
postOrder(root->lchild); // 递归遍历左子树
postOrder(root->rchild); // 递归遍历右子树
printf("%c ", root->data); // 输出节点数据
}
}
void levelOrder(pNode root){
if(!root) return; // 树为空
pNode queue[MAXSIZE]; // 定义节点队列
int front = -1, rear = -1; // 队头、队尾指针
queue[++rear] = root; // 根节点入队
while(front != rear){ // 队列不为空
pNode p = queue[++front]; // 取出队头元素
printf("%c ", p->data); // 输出节点数据
if(p->lchild) queue[++rear] = p->lchild; // 左子树不为空,左子树入队
if(p->rchild) queue[++rear] = p->rchild; // 右子树不为空,右子树入队
}
}
int getPath(pNode root, ElemType target, pNode path[], int *len){
if(!root) return 0; // 树为空
path[*len] = root; // 当前节点入栈
(*len)++; // 栈指针+1
if(root->data == target){ // 如果找到目标节点
return 1;
}
if(getPath(root->lchild, target, path, len) || getPath(root->rchild, target, path, len)){ // 在左右子树中查找目标节点
return 1;
}
(*len)--; // 回溯,栈指针-1
return 0; // 未找到目标节点
}
```
这是一个基本的二叉树程序,您可以根据需要进行修改和完善。需要注意的是,此程序没有进行内存释放,在实际应用中需要注意避免内存泄露问题。