前序建立二叉树数据结构
时间: 2023-11-26 16:43:52 浏览: 33
前序建立二叉树的步骤如下:
1. 读入当前节点的值
2. 如果当前节点的值为特殊字符(如'#'),则返回空节点
3. 创建一个新节点,将当前节点的值赋给新节点
4. 递归创建左子树,将左子树的根节点赋给新节点的左指针
5. 递归创建右子树,将右子树的根节点赋给新节点的右指针
6. 返回新节点
例如,对于前序遍历序列"ABD##E##CF##G##",可以按照以下步骤建立二叉树:
1. 读入'A',创建一个值为'A'的新节点
2. 读入'B',创建一个值为'B'的新节点,将其赋给A的左指针
3. 读入'D',创建一个值为'D'的新节点,将其赋给B的左指针
4. 读入'#',返回空节点,将其赋给D的左指针
5. 读入'#',返回空节点,将其赋给D的右指针
6. 读入'E',创建一个值为'E'的新节点,将其赋给B的右指针
7. 读入'#',返回空节点,将其赋给E的左指针
8. 读入'#',返回空节点,将其赋给E的右指针
9. 读入'C',创建一个值为'C'的新节点,将其赋给A的右指针
10. 读入'F',创建一个值为'F'的新节点,将其赋给C的左指针
11. 读入'#',返回空节点,将其赋给F的左指针
12. 读入'#',返回空节点,将其赋给F的右指针
13. 读入'G',创建一个值为'G'的新节点,将其赋给C的右指针
14. 读入'#',返回空节点,将其赋给G的左指针
15. 读入'#',返回空节点,将其赋给G的右指针
建立完成后,二叉树的结构如下:
```
A
/ \
B C
/ \ / \
D E G
```
相关问题
二叉树的链式存储结构创建(前序法) 二叉树的前序遍历 二叉树的中序遍历 二叉树的后序遍历 主函数功能菜单创建
二叉树的链式存储结构可以通过定义一个结构体来实现,结构体中包含一个数据域和两个指向左右子树的指针。具体实现如下:
```
typedef struct TreeNode{
int data;
struct TreeNode *left;
struct TreeNode *right;
}TreeNode, *Tree;
Tree createTree(){
int data;
scanf("%d", &data);
if(data == -1){ // -1表示空节点
return NULL;
}
Tree root = (Tree)malloc(sizeof(TreeNode));
root->data = data;
root->left = createTree();
root->right = createTree();
return root;
}
```
以上代码实现了二叉树的链式存储结构的创建,其中createTree()函数使用前序遍历的方式输入二叉树的节点数据,-1表示空节点。
接下来是二叉树的遍历,分别实现前序、中序和后序遍历:
```
void preOrder(Tree root){
if(root == NULL){
return;
}
printf("%d ", root->data);
preOrder(root->left);
preOrder(root->right);
}
void inOrder(Tree root){
if(root == NULL){
return;
}
inOrder(root->left);
printf("%d ", root->data);
inOrder(root->right);
}
void postOrder(Tree root){
if(root == NULL){
return;
}
postOrder(root->left);
postOrder(root->right);
printf("%d ", root->data);
}
```
以上代码分别实现了前序、中序和后序遍历,其中preOrder()函数实现了前序遍历,inOrder()函数实现了中序遍历,postOrder()函数实现了后序遍历。
最后是主函数功能菜单的创建,可以使用switch语句实现:
```
int main(){
Tree root = NULL;
int choice;
do{
printf("1. 创建二叉树\n");
printf("2. 前序遍历\n");
printf("3. 中序遍历\n");
printf("4. 后序遍历\n");
printf("0. 退出\n");
scanf("%d", &choice);
switch(choice){
case 1:
printf("请输入二叉树的节点数据,-1表示空节点:\n");
root = createTree();
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 0:
printf("程序已退出!\n");
break;
default:
printf("输入有误,请重新输入!\n");
break;
}
}while(choice != 0);
return 0;
}
```
以上代码实现了一个简单的二叉树遍历程序,用户可以通过菜单选择需要的功能。注意,在实际使用中,需要在程序结束时释放二叉树的内存空间。
用c语言写一个关于数据结构二叉树的程序要求包括输入二叉树,前序遍历二叉树,中序遍历二叉树,后序遍历二叉树,层次遍历二叉树等功能且要求有菜单
好的,以下是一个简单的关于数据结构二叉树的程序,包括输入二叉树,前序遍历二叉树,中序遍历二叉树,后序遍历二叉树,层次遍历二叉树等功能,并且有菜单供用户选择。
```c
#include <stdio.h>
#include <stdlib.h>
//定义二叉树结构体
typedef struct tree_node{
int data;
struct tree_node *left;
struct tree_node *right;
}tree_node;
//创建树节点
tree_node* create_node(int data){
tree_node *node = (tree_node*)malloc(sizeof(tree_node));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
//插入节点到二叉树
tree_node* insert_node(tree_node *root, int data){
if(root == NULL){
root = create_node(data);
}else if(data <= root->data){
root->left = insert_node(root->left, data);
}else{
root->right = insert_node(root->right, data);
}
return root;
}
//前序遍历二叉树
void preorder_tree(tree_node *root){
if(root == NULL)
return;
printf("%d ", root->data);
preorder_tree(root->left);
preorder_tree(root->right);
}
//中序遍历二叉树
void inorder_tree(tree_node *root){
if(root == NULL)
return;
inorder_tree(root->left);
printf("%d ", root->data);
inorder_tree(root->right);
}
//后序遍历二叉树
void postorder_tree(tree_node *root){
if(root == NULL)
return;
postorder_tree(root->left);
postorder_tree(root->right);
printf("%d ", root->data);
}
//获取树的高度
int get_height(tree_node *root){
if(root == NULL)
return -1;
int left_height = get_height(root->left);
int right_height = get_height(root->right);
if(left_height > right_height)
return left_height + 1;
else
return right_height + 1;
}
//按层次遍历二叉树
void level_order_tree(tree_node *root){
if(root == NULL)
return;
int height = get_height(root);
int i;
for(i = 0; i <= height; i++){
print_level(root, i);
}
}
//按层次打印二叉树
void print_level(tree_node *root, int level){
if(root == NULL)
return;
if(level == 0){
printf("%d ", root->data);
}else{
print_level(root->left, level - 1);
print_level(root->right, level - 1);
}
}
int main(){
tree_node *root = NULL;
int choice, data;
do{
printf("\n1. 插入节点");
printf("\n2. 前序遍历");
printf("\n3. 中序遍历");
printf("\n4. 后序遍历");
printf("\n5. 层次遍历");
printf("\n0. 退出");
printf("\n请输入你的选择:");
scanf("%d", &choice);
switch(choice){
case 0:
break;
case 1:
printf("\n请输入节点值:");
scanf("%d", &data);
root = insert_node(root, data);
break;
case 2:
printf("\n前序遍历结果:");
preorder_tree(root);
break;
case 3:
printf("\n中序遍历结果:");
inorder_tree(root);
break;
case 4:
printf("\n后序遍历结果:");
postorder_tree(root);
break;
case 5:
printf("\n层次遍历结果:");
level_order_tree(root);
break;
default:
printf("\n请输入正确的选择!");
break;
}
}while(choice != 0);
return 0;
}
```
在程序中,我们定义了一个二叉树节点的结构体,并定义了一些函数来实现不同的功能。在主函数中,我们使用了一个 do-while 循环来让用户选择操作,用户可以选择插入节点、前序遍历、中序遍历、后序遍历、层次遍历或退出程序。根据用户的选择,程序会调用相应的函数来实现相应的功能。
以上是一个简单的关于数据结构二叉树的程序,仅供参考。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)