1 typedef int Status; 2 typedef int Boolean; 3 typedef int ElemType; 4 5 typedef char TElemType ; 6 7 typedef struct BiTNode 8 { 9 TElemType data; 10 BiTNode *lchild,*rchild;//左右孩子指针 11 12 }BiTNode,*BiTree; 13 14 15 Status InitBiTree(BiTree &T){ 16 //操作结果:构造空二叉树 17 T=NULL; 18 return OK; 19 } 20 21 void DestroyBiTree(BiTree &T){ 22 //初始条件:二叉树存在。操作结果:销毁而茶树T 23 if(T){//非空树 24 if(T->lchild)//有左孩子 25 DestroyBiTree(T->lchild);//销毁左孩子子树 26 if(T->rchild)//有右孩子 27 DestroyBiTree(T->rchild);//销毁右孩子 28 free(T);//释放根节点 29 T=NULL; 30 31 } 32 } 33 34 35 void CreateBiTree(BiTree &T){ 36 TElemType ch; 37 #ifdef CHAR 38 scanf("%c",&ch); 39 #endif 40 #ifdef INT 41 scanf("%d",&ch); 42 #endif 43 if(ch==NULL) 44 T=NULL; 45 else{ 46 T=(BiTree)malloc(sizeof(BiTNode)); 47 if(!T) 48 exit(OVERFLOW); 49 T->data=ch;//生成根节点 50 CreateBiTree(T->lchild);//构造左孩子 51 CreateBiTree(T->rchild);//构造右孩子 52 } 53 } 54 55 Status BiTreeEmpty(BiTree T){ 56 if(T) 57 return FALSE; 58 } 59 60 61 int BiTreeDepth(BiTree T){ 62 //初始条件:二叉树T存在。操作结果:返回T的深度 63 int i,j; 64 if(!T) 65 return 0; 66 if(T->lchild) 67 i=BiTreeDepth(T->lchild); 68 else 69 i=0; 70 if(T->rchild) 71 j=BiTreeDepth(T->rchild); 72 else 73 j=0; 74 return i>j?i+1:j+1; 75 } 76 77 TElemType Root(BiTree T){ 78 //初始条件:二叉树T存在。操作结果:返回T的根 79 if(BiTreeEmpty(T)) 80 return NULL; 81 else 82 return T->data; 83 } 84 85 86 void PreOrderTraverse(BiTree T,Status(*Visit)(TElemType)) 87 { // 初始条件: 二叉树T存在,Visit是对结点操作的应用函数。算法6.1,有改动 88 // 操作结果: 先序递归遍历T,对每个结点调用函数Visit一次且仅一次 89 if(T) // T不空 90 { 91 Visit(T->data); // 先访问根结点 92 PreOrderTraverse(T->lchild,Visit); // 再先序遍历左子树 93 PreOrderTraverse(T->rchild,Visit); // 最后先序遍历右子树 94 } 95 } 96 97 void InOrderTraverse(BiTree T,Status(*Visit)(TElemType)) 98 { // 初始条件: 二叉树T存在,Visit是对结点操作的应用函数 99 // 操作结果: 中序递归遍历T,对每个结点调用函数Visit一次且仅一次 100 if(T) 101 { 102 InOrderTraverse(T->lchild,Visit); // 先中序遍历左子树 103 Visit(T->data); // 再访问根结点 104 InOrderTraverse(T->rchild,Visit); // 最后中序遍历右子树 105 } 106 } 107 108 109 void PostOrderTraverse(BiTree T,Status(*Visit)(TElemType)) 110 { // 初始条件: 二叉树T存在,Visit是对结点操作的应用函数 111 // 操作结果: 后序递归遍历T,对每个结点调用函数Visit一次且仅一次 112 if(T) // T不空 113 { 114 PostOrderTraverse(T->lchild,Visit); // 先后序遍历左子树 115 PostOrderTraverse(T->rchild,Visit); // 再后序遍历右子树 116 Visit(T->data); // 最后访问根结点 117 } 118 } 119 120 121 void LevelOrderTraverse(BiTree T,Status(*Visit)(TElemType)) 122 { // 初始条件:二叉树T存在,Visit是对结点操作的应用函数 123 // 操作结果:层序递归遍历T(利用队列),对每个结点调用函数Visit一次且仅一次 124 LinkQueue q; 125 QElemType a; 126 if(T) 127 { 128 InitQueue(q); 129 EnQueue(q,T); 130 while(!QueueEmpty(q)) 131 { 132 DeQueue(q,a); 133 Visit(a->data); 134 if(a->lchild!=NULL) 135 EnQueue(q,a->lchild); 136 if(a->rchild!=NULL) 137 EnQueue(q,a->rchild); 138 } 139 printf("\n"); 140 } 141 }
浙公网安备 33010602011771号