数据结构 二叉树前序遍历 C语言

二叉树的遍历:是指从根节点出发,按照某种次序依次访问二叉树中的所有结点。

二叉树遍历一共又有四种:
1.前序遍历
2.后序遍历
3.中序遍历
4.层序遍历

口诀:
前序遍历:根左右
前序遍历:若二叉树为空,则空操作返,否则先访问根节点,然后前序遍历左子树,在前序遍历右子树。
在这里插入图片描述从根节点A开始遍历,然后先遍历左子树,就是B,B的左子树是D,D的左子树是H,然后从H到I然后是E,然后是J,然后是C,C相当于F是根节点,然后遍历F然后是K,然后是G。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200615191515459.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDE3NDMxMg==,size_16,color_FFFFFF,t_70#pic_center#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node* left;
struct node* right;
} Node;
//先序遍历
void preorder(Node* node){
if(node !=NULL){
printf("%d",node -> data);
preorder(node -> left);
preorder(node -> right);
}
}
/
接下来我们举个例子遍历如下的图像
在这里插入图片描述
代码如下:

#include <stdio.h>
#include <stdlib.h>
typedef struct node{
  int data;
  struct node* left; 
  struct node* right;
} Node;
//先序遍历
void preorder(Node* node){
  if(node !=NULL){
    printf("%d",node -> data);
    preorder(node -> left);
    preorder(node -> right);
  }
  }

int main(){
Node n1;
Node n2;
Node n3;
Node n4;
n1.data = 5;
n2.data=6;
n3.data =7;
n4.data=8;
n1.left = &n2;
n1.right = &n3;
n2.left =&n4;
n2.right=NULL;
n3.left =NULL;
n3.right =NULL;
n4.left=NULL;
n4. right=NULL;

preorder(&n1);
}

结果如下
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的关于数据结构二叉树的程序,包括输入二叉树前序遍历二叉树,中序遍历二叉树,后序遍历二叉树,层次遍历二叉树等功能,并且有菜单供用户选择。 ```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 循环来让用户选择操作,用户可以选择插入节点、前序遍历、中序遍历、后序遍历、层次遍历或退出程序。根据用户的选择,程序会调用相应的函数来实现相应的功能。 以上是一个简单的关于数据结构二叉树的程序,仅供参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值