数据结构之二叉树的遍历

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

#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;
}

这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494496.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 5丨员工奖金【难度简单】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很远。 &#x1f345;题目汇总(…

从换脸到换姿势,AI 在图像处理的道路上越走越魔幻

来源&#xff1a;专知加州大学伯克利分校的研究人员&#xff0c;近日在著名预印本网站 arXive 上&#xff0c;发布了最新的图像迁移成果&#xff1a;人体姿势和舞蹈动作迁移。旨在把专业舞蹈演员的动作迁移到不会跳舞的人身上&#xff0c;算法输出流畅&#xff0c;还原度极高。…

sql中的并、交、差

⑸ 集合运算连接 有时候&#xff0c;用户希望在SQL查询中利用关系代数中的集合运算&#xff08;并、交、差&#xff09;来组合关系&#xff0c;SQL为此提供了相应的运算符&#xff1a;UNION、INTERSECT、EXCEPT(oracle的minus?)&#xff0c;分别对应于集合运算的∪、∩、-。它…

C语言实现大数据除法

本题要求计算A/B&#xff0c;其中A是不超过1000位的正整数&#xff0c;B是1位正整数。你需要输出商数Q和余数R&#xff0c;使得A B * Q R成立。 输入格式&#xff1a; 输入在1行中依次给出A和B&#xff0c;中间以1空格分隔。 输出格式&#xff1a; 在1行中依次输出Q和R&a…

每日一道题,划水有意义,看我不卷死你们(评论送书)

&#x1f345; 作者主页&#xff1a;不吃西红柿 &#x1f345; 简介&#xff1a;CSDN博客专家 & 总榜前十&#x1f3c6;、HDZ核心组成员。欢迎点赞、收藏、评论 &#x1f345; 粉丝专属福利&#xff1a;知识体系、面试题库、技术互助、简历模板。文末公众号领取 &#x1f…

计算机视觉已超越人类眼睛?腾讯优图与《科学》杂志全面解读

来源: 腾讯研究院摘要&#xff1a;视觉是人类认知世界的重要组成部分&#xff0c;而计算机视觉作为人工智能的核心技术之一&#xff0c;近几年的发展现状如何&#xff1f;视觉是人类认知世界的重要组成部分&#xff0c;而计算机视觉作为人工智能的核心技术之一&#xff0c;近几…

ScrollView与TableView实现选择效果

在cocos2dx中&#xff0c;ScrollView与TableView都可以实现选择效果&#xff0c;其中ScrollView较为原始&#xff0c;TableView的格子大小可以不与winSize一样大。 ScrollView实现 #include "T25ScrollView.h" #include "AppMacros.h"CCScene* T25Scroll…

科学家发现新的人类脑细胞,或可解答一个难题

来源&#xff1a;中国生物技术网关于人类大脑最令人感兴趣的问题之一&#xff0c;也是神经科学家们最难回答的问题之一&#xff0c;就是到底是什么让我们的大脑与其他动物的大脑区别开来。Allen脑科学研究所的研究员Ed Lein博士说&#xff1a;“我们并不清楚是什么让人类大脑变…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 6丨统计各专业学生人数【难度中等】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很远。 &#x1f345;题目汇总(…

五问智能教育未来发展:重点解决什么问题?

来源&#xff1a;人民日报日前&#xff0c;首届中国智能教育大会在北京举行&#xff0c;教育部有关负责人、人工智能专家和教育专家、一些地方政府及教育行政部门负责人、大中小学校长、教师和企业家等近1000人参加。与会代表认为&#xff0c;智能教育将会越来越多地影响每一个…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 6丨寻找用户推荐人【难度简单】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很远。 &#x1f345;题目汇总(…

实现超级玛丽上下左右运动

用Cocos2dx实现超级玛丽&#xff0c;首先用帧循环定时器判断方向&#xff0c;再在类中实现运行以及判断是否能运动。 方向控制 void LayerGame::moveMario(float dt) { #ifdef WIN32short key;key GetKeyState(F);if (key < 0) _marioDir Common::RIGHT;key GetKeyStat…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 7丨大的国家【难度简单】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很远。 &#x1f345;题目汇总(…

自动驾驶前沿报告!解密六大关键技术,全球人才分布

来源&#xff1a;智东西摘要&#xff1a;清华-中国工程院知识智能联合研究中心从技术、人才、应用和趋势的维度盘点自动驾驶的发展。从传统车企到新造车势力&#xff0c;再到互联网大佬&#xff0c;都在加注自动驾驶。自动驾驶既指向了更高效安全的交通运营系统&#xff0c;也意…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 7丨好友申请 I :总体通过率【难度简单】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很远。 &#x1f345;题目汇总(…

边缘计算技术发展与对策研究

来源&#xff1a;5G作者&#xff1a;洪学海&#xff0c;中国科学院计算技术研究所&#xff0c;中国科学院计算机网络信息中心&#xff0c;研究员&#xff1b;汪洋&#xff0c;中国科学院计算机网络信息中心。未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&a…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 7丨字节面试真题【难度困难】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很远。 &#x1f345;题目汇总(…

发布 | 2018年中美智慧城市行业研究系列报告

来源&#xff1a;桥域咨询报告链接:https://pan.baidu.com/s/1fGrtzH0nLsldDvpE04DY6A 密码:q9q2未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 8丨判断三角形【难度简单】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很远。 &#x1f345;题目汇总(…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 8丨平面上的最近距离【难度中等】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很远。 &#x1f345;题目汇总(…