二叉树的遍历分为前序遍历,中序遍历,后序遍历,层序遍历,在本文中,前三种由递归实现,层序遍历由队列实现。

#include "stdio.h"
#include "stdlib.h"
#include "windows.h"
typedef struct Node
{char data;struct Node *Left;struct Node *Right;struct Node *Next;
}BT;typedef struct { /* 链队列结构 */BT *rear; /* 指向队尾结点 */BT *front; /* 指向队头结点 */
} LinkQueue;
//入队
LinkQueue* AddQuee(LinkQueue *PtrL,BT* item)
{BT *node;node=PtrL->rear;if (PtrL->front==NULL){BT *q=(BT*)malloc(sizeof(BT));q->Left=item->Left;q->Right=item->Right;q->Next=NULL;q->data=item->data;PtrL->front=q;PtrL->rear=q;return PtrL;}else{BT *q=(BT*)malloc(sizeof(BT));q->Next=NULL;q->Left=item->Left;q->Right=item->Right;q->data=item->data;node->Next=q;PtrL->rear=q;return PtrL;}
}
//出队
BT* DeleteQ ( LinkQueue *PtrQ )
{BT *firstNode;//BT* NodeItem;if (PtrQ->front==NULL){printf("queue is empty");return NULL;}firstNode=PtrQ->front;if (PtrQ->front==PtrQ->rear){PtrQ->front=PtrQ->rear=NULL;}else{PtrQ->front=PtrQ->front->Next;}//NodeItem->data=firstNode->data;//free(firstNode);return firstNode;
}
//判断是否为空
int isempty(LinkQueue *PtrL)
{if (PtrL->rear==NULL){return 1;}else{return 0;}
}BT *CreateBiTree()
{char ch;BT *T;printf("please enter tree node:");scanf("%c",&ch);if (ch=='#'){T=NULL;}else{T=(BT*)malloc(sizeof(BT));T->data=ch;T->Left=CreateBiTree();T->Right=CreateBiTree();}return T;
}//先序遍历
void PreOrderTraversal( BT* tree)
{if (tree){printf("%c ",tree->data);PreOrderTraversal(tree->Left);PreOrderTraversal(tree->Right);}
}//中序遍历
void InOrderTraversal(BT* tree)
{if (tree){PreOrderTraversal(tree->Left);printf("%c ",tree->data);PreOrderTraversal(tree->Right);}
}//后序遍历
void PostOderTraversal(BT *tree)
{if (tree){PostOderTraversal(tree->Left);PostOderTraversal(tree->Right);printf("%c ",tree->data);}
}
//层序遍历
void LevelOrderTraversal(BT *tree)
{BT *bt;LinkQueue *q=(LinkQueue*)malloc(sizeof(LinkQueue));q->front=NULL;q->rear=NULL;if (!tree){return;}AddQuee(q,tree);while(isempty(q)==0){bt=DeleteQ(q);printf("%c ",bt->data);if (bt->Left) AddQuee(q,bt->Left);if (bt->Right) AddQuee(q,bt->Right);}}int PostOrderGetHeight( BT* tree )
{int HL, HR, MaxH;if( tree ) {HL = PostOrderGetHeight(tree->Left); /*求左子树的深度*/HR = PostOrderGetHeight(tree->Right); /*求右子树的深度*/MaxH =(HL> HR)? HL : HR;/*取左右子树较大的深度*/return ( MaxH + 1 ); /*返回树的深度*/}else return 0; /* 空树深度为0 */
}void main()
{BT *t;int a;t=CreateBiTree();printf("\n1.PreOrderTraversal\n");printf("2.MidOrderTraversal\n");printf("3.PostOrderTraversal\n");printf("4.EXIT\n");printf("5.LevelOrderTraversal\n");printf("6.show the hieght of the tree");while (1){printf("please enter your order:");scanf("%d",&a);switch (a){case 1:PreOrderTraversal(t);break;case 2:InOrderTraversal(t);break;case 3:PostOderTraversal(t);break;case 4:exit(0);break;case 5:LevelOrderTraversal(t);break;case 6:printf("%d",PostOrderGetHeight(t));break;default:break;}}
}

运行结果

C++实现二叉树的遍历

#include "iostream"
#include "stack"
#include "queue"using namespace std;//二叉树结点
typedef struct BiTNode{//数据char data;//左右孩子指针struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;//按先序序列创建二叉树
int CreateBiTree(BiTree &T){char data;//按先序次序输入二叉树中结点的值(一个字符),‘#’表示空树scanf("%c",&data);if(data == '#'){T = NULL;}else{T = (BiTree)malloc(sizeof(BiTNode));//生成根结点T->data = data;//构造左子树CreateBiTree(T->lchild);//构造右子树CreateBiTree(T->rchild);}return 0;
}
//输出
void Visit(BiTree T){if(T->data != '#'){printf("%c ",T->data);}
}
//先序遍历
void PreOrder(BiTree T){if(T != NULL){//访问根节点Visit(T);//访问左子结点PreOrder(T->lchild);//访问右子结点PreOrder(T->rchild);}
}
//中序遍历
void InOrder(BiTree T){  if(T != NULL){  //访问左子结点  InOrder(T->lchild);  //访问根节点  Visit(T);  //访问右子结点  InOrder(T->rchild);  }
}
//后序遍历
void PostOrder(BiTree T){if(T != NULL){//访问左子结点PostOrder(T->lchild);//访问右子结点PostOrder(T->rchild);//访问根节点Visit(T);}
}
/* 先序遍历(非递归)思路:访问T->data后,将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,再先序遍历T的右子树。
*/
void PreOrder2(BiTree T){stack<BiTree> stack;//p是遍历指针BiTree p = T;//栈不空或者p不空时循环while(p || !stack.empty()){if(p != NULL){//存入栈中stack.push(p);//访问根节点printf("%c ",p->data);//遍历左子树p = p->lchild;}else{//退栈p = stack.top();stack.pop();//访问右子树p = p->rchild;}}//while
}
/* 中序遍历(非递归)思路:T是要遍历树的根指针,中序遍历要求在遍历完左子树后,访问根,再遍历右子树。先将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,访问T->data,再中序遍历T的右子树。
*/
void InOrder2(BiTree T){stack<BiTree> stack;//p是遍历指针BiTree p = T;//栈不空或者p不空时循环while(p || !stack.empty()){if(p != NULL){//存入栈中stack.push(p);//遍历左子树p = p->lchild;}else{//退栈,访问根节点p = stack.top();printf("%c ",p->data);stack.pop();//访问右子树p = p->rchild;}}//while
}//后序遍历(非递归)
typedef struct BiTNodePost{BiTree biTree;char tag;
}BiTNodePost,*BiTreePost;void PostOrder2(BiTree T){stack<BiTreePost> stack;//p是遍历指针BiTree p = T;BiTreePost BT;//栈不空或者p不空时循环while(p != NULL || !stack.empty()){//遍历左子树while(p != NULL){BT = (BiTreePost)malloc(sizeof(BiTNodePost));BT->biTree = p;//访问过左子树BT->tag = 'L';stack.push(BT);p = p->lchild;}//左右子树访问完毕访问根节点while(!stack.empty() && (stack.top())->tag == 'R'){BT = stack.top();//退栈stack.pop();BT->biTree;printf("%c ",BT->biTree->data);}//遍历右子树if(!stack.empty()){BT = stack.top();//访问过右子树BT->tag = 'R';p = BT->biTree;p = p->rchild;}}//while
}
//层次遍历
void LevelOrder(BiTree T){BiTree p = T;//队列queue<BiTree> queue;//根节点入队queue.push(p);//队列不空循环while(!queue.empty()){//对头元素出队p = queue.front();//访问p指向的结点printf("%c ",p->data);//退出队列queue.pop();//左子树不空,将左子树入队if(p->lchild != NULL){queue.push(p->lchild);}//右子树不空,将右子树入队if(p->rchild != NULL){queue.push(p->rchild);}}
}
int main()
{BiTree T;CreateBiTree(T);printf("先序遍历:\n");PreOrder(T);printf("\n");printf("先序遍历(非递归):\n");PreOrder2(T);printf("\n");printf("中序遍历:\n");InOrder(T);printf("\n");printf("中序遍历(非递归):\n");InOrder2(T);printf("\n");printf("后序遍历:\n");PostOrder(T);printf("\n");printf("后序遍历(非递归):\n");PostOrder2(T);printf("\n");printf("层次遍历:\n");LevelOrder(T);printf("\n");system("pause");return 0;
}

数据结构之二叉树的遍历相关推荐

  1. 算法与数据结构(三) 二叉树的遍历及其线索化(Swift版)

    前面两篇博客介绍了线性表的顺序存储与链式存储以及对应的操作,并且还聊了栈与队列的相关内容.本篇博客我们就继续聊数据结构的相关东西,并且所涉及的相关Demo依然使用面向对象语言Swift来表示.本篇博客 ...

  2. 【Java 数据结构】二叉树的遍历和基本操作

    一.树型结构 1.概念 2.树的表示形式 二.二叉树 1.特点 2.两种特殊的二叉树 3.二叉树的性质 选择题: 4.二叉树的存储 5.二叉树的基本操作 5.1.创建一棵二叉树 5.2.二叉树的遍历 ...

  3. (数据结构)二叉树层次遍历

    二叉树层次遍历 二叉树层次遍历的实现思想是:通过队列数据结构,从树的根结点开始,依次将其左孩子和右孩子入队:而后每次队列中一个结点出队,都将其左孩子和右孩子入队,直到树中所有结点都出队,出队结点的先后 ...

  4. java数据结构二叉树遍历_java数据结构 之 二叉树的遍历(1)

    树(tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合 节点:上图的圆圈,比如A,B,C等都是表示 ...

  5. 【数据结构】二叉树的遍历及应用

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 前言 在二叉树的应用中,常常要求在树中查找某些结点,或者对树中的结点统一进行某种处理.因此, ...

  6. c++ 删除二叉树的子树_数据结构—树|二叉树|前序遍历、中序遍历、后序遍历【图解实现】...

    点击蓝字关注我们 AI研习图书馆,发现不一样的精彩世界 数据 结构 二叉树的遍历 一.树 在谈二叉树的知识点之前,我们首先来看一下树和图的基本概念.树:不包含回路的连通无向图,树是一种简单的非线性结构 ...

  7. 数据结构:二叉树层序遍历和判断是否为完全二叉树

    层序遍历 从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第二层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的节点的过程. while(队列!=NULL) ...

  8. python二叉树遍历例子_python数据结构之二叉树的遍历实例

    遍历方案   从二叉树的递归定义可知,一棵非空的二叉树由根结点及左.右子树这三个基本部分组成.因此,在任一给定结点上,可以按某种次序执行三个操作: 1).访问结点本身(N) 2).遍历该结点的左子树( ...

  9. PTA数据结构与算法题目集 6-9 二叉树的遍历

    PTA数据结构与算法题目集(中文) 6-9 二叉树的遍历 void InorderTraversal( BinTree BT ){if(BT==NULL)return;if(BT->Left){ ...

最新文章

  1. uniapp设置模板路径页面样式混乱解决办法
  2. 提升篇——SELINUX相关介绍
  3. laravel 5.5 整合 jwt 报错Method Tymon\JWTAuth\Commands\JWTGenerateCommand::handle() does not exist解决...
  4. 删除链表的倒数第N个节点—leetcode19
  5. 从Chrome源码看audio/video流媒体实现二
  6. 快速上手,使用 Kotlin 把支付宝小程序装进自己的 App
  7. html5 2015,2015年有用的16大免费的响应式HTML5框架
  8. python百题百练 二级题目_计算机二级选择题(公共基础新大纲)
  9. 运营商网络IP地址分配原则
  10. mysql数据库练习题_50道SQL练习题及答案(MySQL版)
  11. linux集群服务器搭建
  12. php百度网盘登录,php百度网盘同步_http200_mmdb
  13. Verilog 任意分频器设计
  14. 开源软件许可协议介绍
  15. 小米air2se耳机只有一边有声音怎么办_不到200元 小米蓝牙耳机Air2 SE是真香党的选择吗?...
  16. 西门子三菱台达PLC读取国网DLT645协议电表数据方案
  17. 计算机专业jsp项目,可练手
  18. 同程艺龙半年报的喜色,掩盖了旅游竞争的本色
  19. 【知识图谱】构建红楼梦知识图谱
  20. 解决Eclipse中的卡死现象

热门文章

  1. 不是所有问题都适合用神经网络去搞!
  2. Spring Cloud实战小贴士:版本依赖关系
  3. Spring Cloud构建微服务架构:服务容错保护(Hystrix依赖隔离)【Dalston版】
  4. 阿里P7架构师要求:Web核心+开源框架+大型网站架构!含面试题目!
  5. 2019字节跳动秋招笔试
  6. 从源码角度分析Android系统的异常捕获机制是如何运行的
  7. Pytorch 实现 MLP
  8. 基于改进SSD算法的小目标检测与应用
  9. day27 网络编程一
  10. 洛谷 P1824 进击的奶牛 【二分答案】(求最大的最小值)