09.树.二叉树
2016-07-26 11:30
323 查看
二叉树,即二叉链表
#include <stdio.h> #include <stdlib.h> #include <math.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef char TElemType;//TElemType这里假设为char,可以根据需要进行更改 typedef int Status;//Status是函数的类型,其值是函数结果状态代码,如OK等 //结点结构 typedef struct biTNode { TElemType data;//结点数据 struct biTNode *lchild,*rchild;//左右孩子指针 }BiTNode; int index=0; char String[]="AB#D##C##";//前序后的输入字符 /*构造空二叉树T*/ Status InitBiTree(BiTNode **T) { *T=NULL; return OK; } /*按前序输入二叉树中结点的值(一个字符),#表示空树,构造二叉链表表示二叉树T。*/ void CreateBiTree(BiTNode **T) { TElemType ch; ch=String[index++]; if(ch=='#') *T=NULL; else { *T=(BiTNode *)malloc(sizeof(BiTNode)); if(!(*T)) exit(OVERFLOW); (*T)->data=ch;//生成根结点 CreateBiTree(&(*T)->lchild);//构造左子树 CreateBiTree(&(*T)->rchild);//构造右子树 } } /*初始条件: 二叉树T存在 */ /*操作结果: 若T为空二叉树,则返回TRUE,否则FALSE*/ Status BiTreeEmpty(BiTNode *T) { if(T) return FALSE; else return TRUE; } /*初始条件: 二叉树T存在。操作结果: 返回T的深度*/ int BiTreeDepth(BiTNode *T) { int i,j; if(!T) return 0; if(T->lchild) i=BiTreeDepth(T->lchild); else i=0; if(T->rchild) j=BiTreeDepth(T->rchild); else j=0; return i>j? i+1:j+1; } /*初始条件: 二叉树T存在。操作结果: 返回T的根*/ TElemType Root(BiTNode *T) { if(BiTreeEmpty(T)) return ' '; else return T->data; } /*初始条件:二叉树T存在*/ /*操作结果:前序递归遍历T*/ void PreOrderTraverse(BiTNode *T) { if(!T) return; printf("%c",T->data);//显示结点数据,可以更改为其它对结点操作 PreOrderTraverse(T->lchild);//再先序遍历左子树 PreOrderTraverse(T->rchild);//最后先序遍历右子树 } /*初始条件: 二叉树T存在 */ /*操作结果: 中序递归遍历T*/ void InOrderTraverse(BiTNode *T) { if(!T) return; InOrderTraverse(T->lchild); //中序遍历左子树/ printf("%c",T->data);//显示结点数据,可以更改为其它对结点操作/ InOrderTraverse(T->rchild);//最后中序遍历右子树 */ } /*初始条件: 二叉树T存在*/ /*操作结果: 后序递归遍历T*/ void PostOrderTraverse(BiTNode * T) { if(!T) return; PostOrderTraverse(T->lchild);//先后序遍历左子树 PostOrderTraverse(T->rchild);//再后序遍历右子树 printf("%c",T->data);//显示结点数据,可以更改为其它对结点操作 } /*初始条件: 二叉树T存在。操作结果: 清空二叉树T*/ void ClearBiTree(BiTNode **T) { if(*T) { if((*T)->lchild)//有左孩子 ClearBiTree(&(*T)->lchild);//清空左孩子子树 if((*T)->rchild)//有右孩子 ClearBiTree(&(*T)->rchild);//清空右孩子子树 free(*T);//释放根结点 *T=NULL;//空指针赋0 } } int main() { BiTNode *t;//头指针 TElemType e1; int i; InitBiTree(&t); printf("初始化二叉树后,树空否?%d(1:是 0:否)\n",BiTreeEmpty(t)); CreateBiTree(&t); printf("构造空二叉树后,树空否?%d(1:是 0:否)\n",BiTreeEmpty(t)); printf("构造二叉树后, 树的深度=%d\n",BiTreeDepth(t)); e1=Root(t); printf("二叉树的根为: %c\n",e1); printf("\n前序遍历二叉树:"); PreOrderTraverse(t); printf("\n中序遍历二叉树:"); InOrderTraverse(t); printf("\n后序遍历二叉树:"); PostOrderTraverse(t); ClearBiTree(&t); printf("\n清除二叉树后,树空否?%d(1:是 0:否) 树的深度=%d\n",BiTreeEmpty(t),BiTreeDepth(t)); i=Root(t); if(i==' ') printf("树空,无根\n"); return 0; }
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- 一波二叉树遍历问题的C++解答实例分享
- 举例讲解C语言程序中对二叉树数据结构的各种遍历方式
- C++非递归队列实现二叉树的广度优先遍历
- PHP实现的线索二叉树及二叉树遍历方法详解
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- C#非递归先序遍历二叉树实例
- C++将二叉树转为双向链表及判断两个链表是否相交
- C++非递归建立二叉树实例
- C语言实现找出二叉树中某个值的所有路径的方法
- C++实现二叉树遍历序列的求解方法
- C语言实现二叉树遍历的迭代算法
- C语言 二叉树的链式存储实例
- C++实现查找二叉树中和为某一值的所有路径的示例
- 用C语言判断一个二叉树是否为另一个的子结构
- C++实现二叉树非递归遍历方法实例总结
- C++二叉树结构的建立与基本操作
- 深入遍历二叉树的各种操作详解(非递归遍历)