#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1 #define STACK_INIT_SIZE 100
#define STACKINCREMENT 10 typedef int Status;
typedef char ElemType;
typedef struct BTNode{//定义树节点结构体
ElemType data;
struct BTNode *l;
struct BTNode *r;
}BTNode,*BinTree;
typedef BinTree SElemType;
typedef struct{//非递归遍历要使用的栈操作定义
SElemType *base;
SElemType *top;
int stacksize;//当前的栈空间容量
}SqStack;
//定义二叉树的基本操作
BinTree CreateBinTree(BinTree T);//创建二叉树并且返回一个指针
Status Visit(ElemType e);
Status Depth(BinTree T);
Status PreOrderRecursionTraverse(BinTree T,Status(*Visit)(ElemType e));
Status LevelOrderRecursionTraverse(BinTree T,Status(*Visit)(ElemType e));
//定义栈的基本操作
Status InitStack(SqStack *S);
Status Destroy(SqStack *S);
Status StackEmpty(SqStack S);
Status GetTop(SqStack *s,SElemType *e);
Status Pop(SqStack *S,SElemType *e);
Status Push(SqStack *S,SElemType e);
Status StackTraverse(const SqStack *S);//常量? Status PreOrderNoneRecursionTraverse(BinTree T,Status(*Visit)(ElemType e));//非递归先序遍历 int main(){
//int depth;
BinTree Tree=NULL;
Status(*Visit)(ElemType e)=Visit;//使用函数指针,用指针调用函数
printf("请按先序遍历输入二叉树元素(空节点为=):\n");
Tree=CreateBinTree(Tree);
printf("\n先序遍历:\n");
PreOrderRecursionTraverse(Tree,Visit);
printf("\n层序遍历:\n");
LevelOrderRecursionTraverse(Tree,Visit);
}
BinTree CreateBinTree(BinTree T){
char ch;
scanf("%c",&ch);
if(ch=='='){
T=NULL;
}else{
if(!(T=(BTNode *)malloc(sizeof(BTNode)))){
exit(OVERFLOW);
}
T->data=ch;
T->l=CreateBinTree(T->l);
T->r=CreateBinTree(T->r);
}
return T;//返回的T为最后一个结点
}
Status Visit(ElemType e){
if(e=='\0'){
return ERROR;
}else{
printf("%c",e);
}
return OK;
}
Status PreOrderRecursionTraverse(BinTree T,Status(*Visit)(ElemType e))
{
if(T){//判空
if(!Visit(T->data)){//访问不成功,visit返回的是error
return ERROR;
}
PreOrderRecursionTraverse(T->l,Visit);
PreOrderRecursionTraverse(T->r,Visit);
}
return OK;
}
//层遍历
Status LevelOrderRecursionTraverse(BinTree T,Status(*Visit)(ElemType e))
{
if(T){
int front=-;//每一次循环中表示从左到右的父节点的增加
int rear=-;//每一次循环当中用来表示front下一层该父节点左右子节点的变化增加
BTNode *Q[];//用来存储呢每一层从左到右的每一个树节点
Q[++rear]=T;
printf("根节点的数据:%d ",T->data);
while(front!=rear){
BTNode *p;
if(!(p=(BTNode *)malloc(sizeof(BTNode)))){
exit(OVERFLOW);
}
p=Q[++front];
if(p->l){
Q[++rear]=p->l;
printf("节点%d 的数据:%d",rear,p->l->data);
}
if(p->r){
Q[++rear]=p->r;
printf("节点%d 的数据:%d",rear,p->r->data);
}
} } }
/*
Status Depth(BinTree T){
int a,b;
if(!T){
return ERROR;
}else{
a=Depth(T->l)+1;
b=Depth(T->r)+1;
return a>b?a:b;
}
}
Status PreOrderNoneRecursionTraverse(BinTree T,Status(*Visit)(ElemType e)){
SqStack S;
SElemType p;
InitStack(&S);
Push(&S,T);//将T入栈作为第一个操作结点
while(S.base!=S.top){//栈不为空就一直循环,从上到下从左到右的取出
Pop(&S,&p);
if(!Visit(p->data)){//判断是否访问成功
return ERROR;
}
if(p->l){
Push(&S,p->r);//右结点先入栈为了后出栈
}
if(p->r){
Push(&S,p->l);
}
}
DestroyStack(&S);//释放栈
return OK;
}*/

c语言描述的二叉树的基本操作(层序遍历,递归,非递归遍历)的更多相关文章

  1. 【数据结构】——搜索二叉树的插入,查找和删除(递归&非递归)

    一.搜索二叉树的插入,查找,删除 简单说说搜索二叉树概念: 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右 ...

  2. c/c++二叉树的创建与遍历(非递归遍历左右中,破坏树结构)

    二叉树的创建与遍历(非递归遍历左右中,破坏树结构) 创建 二叉树的递归3种遍历方式: 1,先中心,再左树,再右树 2,先左树,再中心,再右树 3,先左树,再右树,再中心 二叉树的非递归4种遍历方式: ...

  3. 二叉树的递归,非递归遍历(C++)

    二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...

  4. 递归/非递归----python深度遍历二叉树(前序遍历,中序遍历,后序遍历)

    递归代码:递归实现很简单 '二叉树结点类' class TreeNode: def __init__(self, x): self.val = x self.left = None self.righ ...

  5. c++实现二叉树层序、前序创建二叉树,递归非递归实现二叉树遍历

    #include <iostream> #include <cstdio> #include <stdio.h> #include <string> # ...

  6. 二叉树的先序、中序以及后序遍历(递归 && 非递归)

    树节点定义: class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 递归建立二 ...

  7. 二叉树——遍历篇(递归/非递归,C++)

    二叉树--遍历篇 二叉树很多算法题都与其遍历相关,笔者经过大量学习.思考,整理总结写下二叉树的遍历篇,涵盖递归和非递归实现. 1.二叉树数据结构及访问函数 #include <stdio.h&g ...

  8. C++版 - LeetCode 144. Binary Tree Preorder Traversal (二叉树先根序遍历,非递归)

    144. Binary Tree Preorder Traversal Difficulty: Medium Given a binary tree, return the preorder trav ...

  9. java数据结构之二叉树遍历的非递归实现

    算法概述递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍历算法.非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似.对 ...

随机推荐

  1. Coursera 机器学习 第8章(上) Unsupervised Learning 学习笔记

    8 Unsupervised Learning8.1 Clustering8.1.1 Unsupervised Learning: Introduction集群(聚类)的概念.什么是无监督学习:对于无 ...

  2. 为数据赋能:腾讯TDSQL分布式金融级数据库前沿技术

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 简介:李海翔,网名"那海蓝蓝",腾讯金融云数据库技术专家.中国人民大学信息学院工程硕士企业导师.著有<数据库事务处 ...

  3. Java入门系列-09-循环结构

    这篇文章为你搞懂5个问题 while 循环如何使用 do-while 循环的使用 for 循环的使用 break.continue 的使用 循环结构的嵌套使用 生活中有很多事情需要我们重复的去做,比如 ...

  4. Redis的Publish/Subscribe

    Publish/Subscribe 从字面上理解就是发布(Publish)与订阅(Subscribe),在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,当一个key值上进行了消息发布 ...

  5. synchronized修饰普通方法和静态方法

    首先,要知道,synchronized关键字修饰普通方法时,获得的锁是对象锁,也就是this.而修饰静态方法时,锁是类锁,也就是类名.class. synchronized修饰普通方法 Synchro ...

  6. git rebase 和 git merge 总结

    git merge 和 git rebase 都是用于合并分支,但二者是存在区别的. 在使用时,记住以下两点: 当你从 remote 去 pull 的时候,永远使用 rebase(除了一个例外) 当你 ...

  7. scss-声明变量与引用

    一.变量的声明 使用$符号可以标识一个变量 $bg-color: #FFFFFF; 二.变量的引用: 变量的引用有一个原则,那就是标准css属性值存在的地方,变量就可以存在. 当编译成css文件的时候 ...

  8. PHP json数据的运用

    今天这里总结一下json数据的使用实例,从5.2版本开始,PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码. 一.json_encode() 1 2 ...

  9. pringMvc-使用原生api

    在springMvc有时候需要使用原生的api: @RequestMapping(value="/testApi") public String testApi(HttpServl ...

  10. 织梦Dedecms主要文件夹目录及模板文件说明

    虽然织梦DedeCMS因为安全问题被人所诟病,但瑕不掩瑜,无论从用户群数量还是时间等各方面,织梦DedeCMS都是国内排名前几的CMS建站程序.如果你想学习CMS的二次开发,织梦DedeCMS是必须需 ...