快捷搜索:  汽车  科技

数据结构中二叉树的层次遍历算法(知识分享数据结构)

数据结构中二叉树的层次遍历算法(知识分享数据结构)输入:ABC_ _DE_G_ _F_ _ _注意创建的时候如果没有左右子树要输入空格后序:CGEFDBA层次:ABCDEFGtypedef char TElemType; typedef int Status; typedef struct BiTNode{ TElemType data; struct BiTNode *lchild *rchild; }BiTNode *BiTree; Status PreCreateBiTree(BiTree &T);//先序输入二叉树 Status PreOrderTraverse(BiTree T Status(*Visit)(TElemType e)); Status InOrderTraverse1(BiTree T Status(*Visit)(TElemType e)); Status InOrderTraverse2(B

今日份分享:将树的基本操作C语言实现,主要考察树的先序,中序,后序和层次遍历方法

二叉树如图:

数据结构中二叉树的层次遍历算法(知识分享数据结构)(1)

先序:ABCDEGF

中序:CBEGDFA

后序:CGEFDBA

层次:ABCDEFG

BiTree.h:

typedef char TElemType; typedef int Status; typedef struct BiTNode{ TElemType data; struct BiTNode *lchild *rchild; }BiTNode *BiTree; Status PreCreateBiTree(BiTree &T);//先序输入二叉树 Status PreOrderTraverse(BiTree T Status(*Visit)(TElemType e)); Status InOrderTraverse1(BiTree T Status(*Visit)(TElemType e)); Status InOrderTraverse2(BiTree T Status(*Visit)(TElemType e)); Status PostOrderTraverse(BiTree T Status(*Visit)(TElemType e)); Status LevelOrderTraverse(BiTree T Status(*Visit)(TElemType e)); Status Visit(TElemType e); Status GetDepth(BiTree T); Status CountNode(BiTree T int &d);

主要函数:

① 先序创建二叉树

注意创建的时候如果没有左右子树要输入空格

输入:ABC_ _DE_G_ _F_ _ _

Status PreCreateBiTree(BiTree &T) { char ch; ch=getchar(); if(ch==' ')T=NULL; else { if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))exit(OVERFLOW); T->data=ch; PreCreateBiTree(T->lchild); PreCreateBiTree(T->rchild); } return OK; }② 先序遍历(递归算法)

Status PreOrderTraverse(BiTree T Status(*Visit)(TElemType e)) { if(T){ if(Visit(T->data)) if(PreOrderTraverse(T->lchild Visit)) if(PreOrderTraverse(T->rchild Visit))return OK; return ERROR; }else return OK; }③ 中序遍历(递归算法)

Status InOrderTraverse2(BiTree T Status(*Visit)(TElemType e)) { if(T){ InOrderTraverse2(T->lchild Visit); Visit(T->data); InOrderTraverse2(T->rchild Visit); } return OK; }④ 中序遍历(非递归算法)

注意此处需要包含C STL头文件include<stack>

Status InOrderTraverse1(BiTree T Status(*Visit)(TElemType e)) { stack<BiTree>S; BiTree p; S.push(T); while(!S.empty()){ while(p=S.top())S.push(p->lchild); p=S.top(); S.pop(); if(!S.empty()){ p=S.top(); S.pop(); if(!Visit(p->data))return ERROR; S.push(p->rchild); } return OK; } }⑤ 后序遍历(递归算法)

Status PostOrderTraverse(BiTree T Status(*Visit)(TElemType e)) { if(T){ PostOrderTraverse(T->lchild Visit); PostOrderTraverse(T->rchild Visit); Visit(T->data); } return OK; }⑥ 层次遍历(使用QUEUE)

可以包含STL<queue>或者定义一个数组,使用循环队列即可。

Status LevelOrderTraverse(BiTree T Status(*Visit)(TElemType e)) { BiTree p; BiTNode *Q[100]; int front rear; front=rear=-1; rear ; Q[rear]=T; while(front!=rear){ front=(front 1)0; p=Q[front]; Visit(p->data); if(p->lchild!=NULL){ rear=(rear 1)0; Q[rear]=p->lchild; } if(p->rchild!=NULL){ rear=(rear 1)0; Q[rear]=p->rchild; } } return OK; }⑦ Visit函数此处使用的是输出

Status Visit(TElemType e) { printf("%c " e); return OK; }⑧ 计算树的节点数

Status CountNode(BiTree T int &d) { if(T){ d ; CountNode(T->lchild d); CountNode(T->rchild d); } return OK; }⑨ 计算树的深度

Status GetDepth(BiTree T) { int hl hr; if(T==NULL)return 0; else{ hl=GetDepth(T->lchild); hr=GetDepth(T->rchild); if(hl>hr)return hl 1; else return hr 1; } }Main函数:

int main() { printf("Create\n"); BiTree T; PreCreateBiTree(T); printf("先序PreTraverse:\n"); PreOrderTraverse(T Visit); printf("\n中序InTraverse:\n"); InOrderTraverse2(T Visit); printf("\n后序PostTraverse:\n"); PostOrderTraverse(T Visit); printf("\nLevelTraverse:\n"); LevelOrderTraverse(T Visit); printf("\n"); CountNode(T d); printf("\n节点数:%d\n" d); printf("树的深度:%d\n" GetDepth(T)); system("pause"); return 0; }

注意:

1. 遍历函数可以写成递归和非递归,递归函数更加简洁。

2. 层次遍历需要使用队列,可以包含C STL<queue>或者定义一个数组,使用循环队列即可。注意每次判断时要把队列的头赋值给临时变量P,左右子树从队尾插入。

3.先序创建树时,要注意创建的时候如果没有左右子树要输入空格

输入:ABC_ _DE_G_ _F_ _ _

————

希望对大家有帮助,有什么C/C 学习上的问题也可以来和我交流!

写在最后:对于准备学习C/C 编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

编程学习书籍分享:

数据结构中二叉树的层次遍历算法(知识分享数据结构)(2)

编程学习视频分享:

数据结构中二叉树的层次遍历算法(知识分享数据结构)(3)

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

对于C/C 感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C 的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!

猜您喜欢: