数据结构之二叉树的遍历
来源:互联网 发布:low pass filter 算法 编辑:程序博客网 时间:2024/06/04 16:09
二叉树的遍历分为前序遍历,中序遍历,后序遍历,层序遍历,在本文中,前三种由递归实现,层序遍历由队列实现。
#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;}
0 0
- 数据结构之二叉树的遍历汇总
- java数据结构之二叉树的遍历
- 数据结构之二叉树的遍历
- 数据结构之二叉树的遍历
- 数据结构实验之二叉树的遍历
- 数据结构之二叉树遍历
- 数据结构之二叉树遍历
- 数据结构之树和二叉树---二叉树的遍历
- 二叉树的遍历:数据结构实验之二叉树二:遍历二叉树
- [C++ 二叉树的构建与遍历] 数据结构实验之二叉树二:遍历二叉树
- 数据结构 - 二叉树的遍历
- 数据结构-----二叉树的遍历
- 数据结构----二叉树的遍历
- 数据结构 二叉树的遍历
- 【数据结构】 二叉树的遍历
- 【数据结构】二叉树的遍历
- 数据结构 - 二叉树的遍历
- 数据结构二叉树的遍历
- 《JAVA编程思想》日志(六)---------访问权限控制
- 使用visual studio 2012碰到的“Stack OverFlow ”的问题
- Android View 与 ViewGroup 事件分发总结
- C语言之位运算
- 【Android Demo】简单手机通讯录
- 数据结构之二叉树的遍历
- 刚刚建立微博,以后天天更新自己的技术学习心得
- Struts2 图片上传 hibernate保存图片于数据库 。。
- ZooKeeper 笔记(4) 实战应用之【消除单点故障】
- c语言学习笔记--初识c
- web service中chain的使用
- 安装mysql-5.7.11-winx64.zip 版本, 启动服务 遇 3534 错误的解决方法
- (java) Convert Sorted Array to Binary Search Tree
- linux命令总结