
第五章 树和二叉树 —— 二叉树的基本操作
发布日期:2021-05-06 10:56:18
浏览次数:28
分类:精选文章
本文共 2867 字,大约阅读时间需要 9 分钟。
二叉树的基本操作
- 编程实现二叉树的先序、中序、后序和层序遍历
- 编程实现非递归中序遍历
- 编程实现:求二叉树的高度和叶子结点个数
代码如下:
#includeusing namespace std;typedef struct BiTNode{ char data; struct BiTNode *lchild,*rchild;} BiTNode,*BiTree;typedef struct StackNode{ BiTree data; struct StackNode *next;}StackNode,*LinkStack;int idx = 0;//创建二叉树void CreateBiTree(BiTree &T,char *treeSeq){ if(treeSeq[idx]=='#') { T=NULL; ++idx; } else { T=new BiTNode; T->data=treeSeq[idx++]; CreateBiTree(T->lchild,treeSeq); //递归创建左子树 CreateBiTree(T->rchild,treeSeq); //递归创建右子树 }}//前序遍历void PreOrderTraverse(BiTree T){ if(T) { cout< data; PreOrderTraverse(T->lchild); PreOrderTraverse(T->rchild); }}//中序遍历void InOrderTraverse(BiTree T){ if(T) { InOrderTraverse(T->lchild); cout< data; InOrderTraverse(T->rchild); }}//后序遍历void PostOrderTraverse(BiTree T){ if(T) { PostOrderTraverse(T->lchild); PostOrderTraverse(T->rchild); cout< data; }}//层序遍历void LevelOrderTraverse(BiTree T){ int i,j; BiTree p[100]; i = j = 0; if (T) p[j++] = T; while(i data; if (p[i]->lchild) p[j++] = p[i]->lchild; if (p[i]->rchild) p[j++] = p[i]->rchild; i++; }}//销毁二叉树void DestroyBiTree(BiTree &T){ if(T) { DestroyBiTree(T->lchild); DestroyBiTree(T->rchild); delete T; }}//求二叉树结点总数int NodeCount(BiTree T){ if(T == NULL ) return 0; else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;}//求叶子结点的个数int LeafCount(BiTree T){ if(T==NULL) //如果是空树返回0 return 0; if (T->lchild == NULL && T->rchild == NULL) return 1; //如果是叶子结点返回1 else return LeafCount(T->lchild) + LeafCount(T->rchild);}//求二叉树的深度int Depth(BiTree T){ if (T==NULL) return 0; else { int m=Depth(T->lchild); int n=Depth(T->rchild); if (m>=n) return m+1; else return n+1; }}void Push(LinkStack &S,BiTree p){ StackNode *q = new StackNode; q->data = p; q->next = S; S = q;}bool Pop(LinkStack &S,BiTree &p){ if (S==NULL) return false; p = S->data; StackNode *q = S; S = S->next; delete q; return true;}//非递归中序遍历void InOrderTraverse_NonRecursive ( BiTree T){ LinkStack S = NULL; BiTree p=T; BiTree q; while ( p || S!=NULL ) { if ( p) { Push( S, p ); p=p->lchild ;//根指针进栈,遍历左子树 } else { Pop( S, q ); // 退栈 cout< data;//访问根结点 p=q->rchild;//遍历右子树 } }}int main(){ char treeSeq[20]="ABC##DE#G##F###"; BiTree T; CreateBiTree(T,treeSeq); cout<<"前序遍历:"; PreOrderTraverse(T); cout<
发表评论
最新留言
很好
[***.229.124.182]2025年03月28日 00时17分37秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
01 背包问题
2019-03-05
JVM - 参数配置影响线程数
2019-03-05
ILI9341几个重要的命令
2019-03-05
AD如何对原理图进行注释
2019-03-05
NC15136: 迷宫
2019-03-05
动态点击a标签
2019-03-05
oracle创建序列语法
2019-03-05
springboot通过控制层跳转页面404
2019-03-05
idea2020 没有 tomcat server
2019-03-05
jq动态修改元素的onclick属性的值
2019-03-05
为什么讨厌所谓仿生AI的说法
2019-03-05
ORACLE 客户端工具
2019-03-05
云服务器springboot jar项目开启jmx remote监控-解决无法连接的问题
2019-03-05
文件上传-FileUpload
2019-03-05
快速排序
2019-03-05
Pyinstaller打包的exe文件过大的解决方法
2019-03-05
Linux的软链接跟Windows快捷方式一样?
2019-03-05
更改github的默认语言类型
2019-03-05
使用bigdecima实例化时传int和string时的精度丢失
2019-03-05