C语言实现二叉树的创建&遍历
算法思想(重点是递归的使用)
利用扩展先序遍历序列创建二叉链表
采用类似先序遍历的递归算法,首先读入当前根结点的数据,如果是'.'则将当前
树根置为空,否则申请一个新结点,存入当前根结点的数据,分别用当前根结点的
左子域和右子域进行递归调用,创建左、右子树.
Code
#include <stdio.h>
#include <stdlib.h> typedef char DataType; //二叉链表结点的数据类型 typedef struct Node //定义二叉树的二叉链表结点结构
{
DataType data;
struct Node *LChild; //左子树
struct Node *RChild; //右子树
}BiTNode,*BiTree; void CreateBiTree(BiTree *bt); //创建二叉链表函数
void PreOrder(BiTree root); //先序遍历二叉树
void InOrder(BiTree root); //中序遍历二叉树
void PostOrder(BiTree root); //后序遍历二叉树 int main()
{
BiTree bt;
int choice;
while(true)
{ //二叉树操作选择菜单
printf("*****************Please enter your choice*****************\n\n");
printf(" choice 1:创建二叉树\n");
printf(" choice 2:先序遍历二叉树\n");
printf(" choice 3:中序遍历二叉树\n");
printf(" choice 4:后序遍历二叉树\n");
printf(" choice 0:退出\n\n");
scanf("%d",&choice);
switch(choice)
{
case : CreateBiTree(&bt);
break;
case : PreOrder(bt);
printf("\n");
break; case : InOrder(bt);
printf("\n");
break;
case : PostOrder(bt);
printf("\n");
break;
case : exit();
break;
default:
printf("ERROR!!\n");
exit();
break;
}
}
return ;
} void CreateBiTree(BiTree *bt)
{
char ch;
printf("Please enter data:");
getchar();
ch = getchar();
if(ch == '.') //读入的数据是'.'则将当前树根置为空
{
*bt = NULL;
}
else //读入正常数据,为当前树根分配地址空间
{
*bt = (BiTree)malloc(sizeof(BiTNode));
(*bt)->data = ch;
CreateBiTree(&((*bt)->LChild)); //递归调用CreateBiTree()函数,处理左子树
CreateBiTree(&((*bt)->RChild)); //递归调用CreateBiTree()函数,处理右子树
}
} void PreOrder(BiTree root) //先序遍历二叉树,root为指向二叉树根结点的指针
{
if(root!=NULL)
{
printf("%c ",root->data); //访问根结点
PreOrder(root->LChild); //先序遍历左子树
PreOrder(root->RChild); //先序遍历右子树
}
} void InOrder(BiTree root) //中序遍历二叉树,root为指向二叉树根结点的指针
{
if(root!=NULL)
{
InOrder(root->LChild); //中序遍历左子树
printf("%c ",root->data); //访问根结点
InOrder(root->RChild); //中序遍历右子树
}
} void PostOrder(BiTree root) //中序遍历二叉树,root为指向二叉树根结点的指针
{
if(root!=NULL)
{
PostOrder(root->LChild); //后序遍历左子树
PostOrder(root->RChild); //后序遍历右子树
printf("%c ",root->data); //访问根结点
}
}
C语言实现二叉树的创建&遍历的更多相关文章
- java 二叉树的创建 遍历
本来说复习一下BFS和DFS,辗转就来到了二叉树...本文包括二叉树的创建和遍历 概念 数据:1 2 3 4 5 6 7生成一颗二叉树 上面的数是数据,不是位置,要区别一下数据和位置 红色的代表位置, ...
- 二叉树中序遍历 (C语言实现)
在计算机科学中,树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构.二叉树是每个节点最多有两个子树的有序树.通常子树被称作“左子树”(left subtre ...
- 数据结构二叉树的java实现,包括二叉树的创建、搜索、删除和遍历
根据自己的学习体会并参考了一些网上的资料,以java写出了二叉树的创建.搜索.删除和遍历等操作,尚未实现的功能有:根据先序和中序遍历,得到后序遍历以及根据后序和中序遍历,得到先序遍历,以及获取栈的深度 ...
- Java实现二叉树的创建和遍历操作(有更新)
博主强烈建议跳过分割线前面的部分,直接看下文更新的那些即可. 最近在学习二叉树的相关知识,一开始真的是毫无头绪.本来学的是C++二叉树,但苦于编译器老是出故障,于是就转用Java来实现二叉树的操作.但 ...
- c/c++二叉树的创建与遍历(非递归遍历左右中,破坏树结构)
二叉树的创建与遍历(非递归遍历左右中,破坏树结构) 创建 二叉树的递归3种遍历方式: 1,先中心,再左树,再右树 2,先左树,再中心,再右树 3,先左树,再右树,再中心 二叉树的非递归4种遍历方式: ...
- C语言实现二叉树的建立、遍历以及表达式的计算
实现代码 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <ctype ...
- 二叉树的创建、遍历(递归和非递归实现)、交换左右子数、求高度(c++实现)
要求:以左右孩子表示法实现链式方式存储的二叉树(lson—rson),以菜单方式设计并完成功能任务:建立并存储树.输出前序遍历结果.输出中序遍历结果.输出后序遍历结果.交换左右子树.统计高度,其中对于 ...
- JS实现二叉树的创建和遍历
1.先说二叉树的遍历,遍历方式: 前序遍历:先遍历根结点,然后左子树,再右子树 中序遍历:先遍历左子树,然后根结点,再右子树 后续遍历:先遍历左子树,然后右子树,再根结点 上代码:主要还是利用递归 ...
- Java实现二叉树的创建、递归/非递归遍历
近期复习数据结构中的二叉树的相关问题,在这里整理一下 这里包含: 1.二叉树的先序创建 2.二叉树的递归先序遍历 3.二叉树的非递归先序遍历 4.二叉树的递归中序遍历 5.二叉树的非递归中序遍历 6. ...
随机推荐
- [POJ1273][USACO4.2]Drainage Ditches (网络流最大流)
题意 网络流最大流模板 思路 EK也不会超时 所以说是一个数据比较水的模板题 但是POJ有点坑,多组数据,而且题目没给 哭得我AC率直掉 代码 用的朴素Dinic #include<cstdio ...
- springmvc是如何工作的
上图便是springmvc的工作流程,看着条条框框的,其实说的直白一点,springmvc就是负责处理用户的需求(request/url),它的负责人(核心组件)就是前端控制器(DispatcherS ...
- Elasticsearch 滚动重启 必读
关键词:elasticsearch , es , 滚动重启 , 禁止分片 由于之前es GC没有怎么调优,结果今天被大量scroll查询查挂了,GC 卡死了.然后为了先恢复给业务使用,也没什么其他办法 ...
- springboot-项目获取resources下文件碰到的问题(classPath下找不到文件和文件名乱码)
项目是spring-boot + spring-cloud 并使用maven 管理依赖.在springboot+maven项目下怎么读取resources下的文件实现文件下载? 怎么获取resourc ...
- javaEE学习路线与目标
1.Java基础知识(15-30天) 2.了解html+css+js+jq+bootstrap(7天) 3.mysql+jdbc(重点)(3天) 4.xml(1天) 5.http协议+tomcat(1 ...
- 【react】---手动封装一个简易版的redux
export let createStore = (reducer)=>{ //定义默认的state let state; //定义默认的action let actionTypes = &qu ...
- c#使用 Newtonsoft.Json 将entity转json时,忽略为null的属性
c#使用 Newtonsoft.Json 将entity转json时,忽略为null的属性,直接在属性上加下面的特性 [JsonProperty(NullValueHandling=NullValue ...
- LoadRunner(三)——LR相关概念&组成部分
参考学习感谢:<精通软件性能测试与LoadRunner实战> 一.运行机制和主要组成部分 1.LoadRunner主要由VuGen.Controller和Analysis三部分构成: 2. ...
- LeetCode编程训练 - 回溯(Backtracking)
回溯基础 先看一个使用回溯方法求集合子集的例子(78. Subsets),以下代码基本说明了回溯使用的基本框架: //78. Subsets class Solution { private: voi ...
- Vue 单文件元件 — vTabs
简书原文 这是我做了第二个单文件元件 第一个在这里vCheckBox 这次这个叫vTabs,用于操作标签页 演示DEMO 演示DEMO2 - 子组件模式及别名 演示DEMO3 - 极简模式 示例: h ...