二叉树及其四种遍历
来源:互联网 发布:电信软件下载 编辑:程序博客网 时间:2024/05/23 11:34
二叉树及其四种遍历
本次主要是针对二叉树的基本操作,另外还有二叉树相似的判断和叶子结点的计数,这些方法中都用到了递归。关于结构体的预定义还是会放在之前的博客(数据结构常用于定义总结)中
二叉树的数据结构
/*-------二叉树的二叉链结点结构定义------*/#define TElemType chartypedef struct BiTNode{ // 结点结构 TElemType data; // 结点数据 struct BiTNode *lchild, *rchild; // 左右 孩子指针} BiTNode, *BiTree;/*-----------基本操作的函数-------------*/
基本操作
//按照二叉树的定义初始化一个空树Status InitBiTree(BiTree *bt){ *bt = (BiTree )malloc(sizeof(BiTNode)); if (!bt)return OVERFLOW; *bt = NULL; return OK;}//构造二叉链表表示的二叉树T//按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树Status CreateBiTree(BiTree *T){ TElemType ch; printf_s("请输入数据:"); scanf_s("%c", &ch); getchar(); //getchar()用于处理回车占字符的问题 if (ch == '#') *T = NULL; else{ *T = (BiTree)malloc(sizeof(BiTNode)); if (!T)return OVERFLOW; // 若内存分配失败,则返回OVERFLOW (*T)->data = ch; // 生成根结点 CreateBiTree(&((*T)->lchild)); //构建左子树 CreateBiTree(&((*T)->rchild)); //构建右子树 } return OK;}
四种遍历
//先序遍历二叉树T,对每个结点的值进行输出打印(表示已经访问过)void PreOrderTraverse(BiTree T){ if (!T)return; // 若为一个空树,则直接结束 printf_s("%c", T->data); // 显示结点数据,可以更改为其它对结点操作 PreOrderTraverse(T->lchild);// 先遍历左孩子 PreOrderTraverse(T->rchild);// 再遍历右孩子}//中序遍历二叉树T,对每个结点的值进行输出打印(表示已经访问过)void InOrderTraverse(BiTree T){ if (!T)return; // 若为一个空树,则直接结束 InOrderTraverse(T->lchild);// 先遍历左孩子 printf_s("%c", T->data); // 显示结点数据,可以更改为其它对结点操作 InOrderTraverse(T->rchild);// 再遍历右孩子}//后序遍历二叉树T,对每个结点的值进行输出打印(表示已经访问过)void PostOrderTraverse(BiTree T){ if (!T)return; // 若为一个空树,则直接结束 PostOrderTraverse(T->lchild);// 先遍历左孩子 PostOrderTraverse(T->rchild);// 再遍历右孩子 printf_s("%c", T->data); // 显示结点数据,可以更改为其它对结点操作}//层序遍历二叉树T,对每个结点的值进行输出打印(表示已经访问过)void LevelOrderTraverse(BiTree T){ if (!T)return; // 若为一个空树,则直接结束 SqQueue Q; BiTree* e; e = (BiTree *)malloc(sizeof(BiTree)); InitQueue(&Q); EnQueue(&Q, T); //将根结点入队列 while (!IsQueueEmpty(Q)){ //当队列不空时 DeQueue(&Q, e); //取出队首元素 printf_s("%c", (*e)->data); if ((*e)->lchild)EnQueue(&Q, (*e)->lchild);//当队首元素左子树存在时让其入队列 if ((*e)->rchild)EnQueue(&Q, (*e)->rchild);//当队首元素右子树存在时让其入队列 } printf_s("\n"); }
其它函数
Status SimilarBiTree(BiTree B, BiTree T){ if (!B && !T)return TRUE; // 若两棵二叉树都为空树,则相似 if (!B && T || B && !T)return FALSE; //若其中一棵为空树,而另一棵不为,则不相似 if (SimilarBiTree(B->lchild, T->lchild) && SimilarBiTree(B->rchild, T->rchild)){ return TRUE; } return FALSE;}int Count(BiTree T){ if (!T)return 0; //空树有0个叶子结点 if (!T->lchild && !T->rchild)return 1; else { return Count(T->lchild) + Count(T->rchild); }}
阅读全文
0 0
- 二叉树及其四种遍历
- 二叉树-四种遍历及其他应用
- 二叉树及其遍历
- 二叉树及其遍历
- 二叉树及其遍历
- 二叉树及其遍历
- 四:二叉树遍历
- 排序二叉树及其遍历
- 遍历二叉树及其应用
- 二叉树创建及其遍历
- 二叉树及其遍历算法
- 普通二叉树及其遍历
- 二叉树及其各种遍历
- 线索二叉树及其遍历
- 遍历二叉树及其应用
- 二叉树的四种遍历
- 二叉树的四种遍历
- 二叉树的四种遍历实现
- 文章标题
- Hello World!
- Linux多线程同步方式总结
- Bochs调试内核
- 2017.11.19
- 二叉树及其四种遍历
- HTML5游戏设计与制作
- 图的邻接矩阵表示
- AJAX跨越、JS跨越请求 No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin
- MyBatis HelloWorld
- 数据库相关概念解析
- 前端优化
- 关系数据结构
- HDU2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 (多重背包)