当前位置:编程学习 > C/C++ >>

C 数据结构:树 功能:基本操作

树的定义便是递归定义,所以绝大多功能采用递归完成


001 #include <stdio.h> 

002 #include <malloc.h> 

003 #include <stdlib.h> 

004 #define MAX 100 

005 #define ERROR 0 

006 #define OK 1 

007 #ifndef Type 

008 typedef char Type; 

009 #endif 

010   

011 typedef struct Bitree 

012 { 

013     Type data; 

014     struct Bitree *lchild; 

015     struct Bitree *rchild; 

016 }BitNode, *BiTree; 

017   

018 int InitBiTree(BiTree *T)//初始化空树 

019 { 

020     *T = NULL; 

021     return OK; 

022 }<SPAN style="COLOR: #e53333" minmax_bound="true">//假如传入的参数是指向BitNode的指针,也就是BiTree  由于对于树的构建是使用递归的方式,所以在对子树 

023 //因为子树的类型也为BiTree 所以此时无法改变其实(传值,形参),所以参数要使用指向Bitree的指针</SPAN> /* 

024 int Creat(BiTree T) 

025 { 

026     Type p; 

027   

028     scanf("%c", &p); 

029       

030     if (p == ' ') 

031         T = NULL; 

032     else 

033     { 

034         T->data = p; 

035         T->lchild = (BiTree)malloc(sizeof(BitNode)); 

036         Creat(T->lchild); 

037         T->rchild = (BiTree)malloc(sizeof(BitNode)); 

038         Creat(T->rchild); 

039     } 

040     return OK; 

041 } 

042 */ 

043   

044 int CreatBiTree(BiTree *T)//用递归的方式创建树(前序输入,空格表示子树为空) 

045 { 

046     Type p; 

047   

048     scanf("%c", &p); 

049   

050     if (p == ' ') 

051     *T = NULL; 

052     else 

053     { 

054     *T = (BiTree)malloc(sizeof(BitNode)); 

055     (*T)->data = p; 

056     CreatBiTree(&(*T)->lchild); 

057     CreatBiTree(&(*T)->rchild); 

058     } 

059     return OK; 

060 } 

061   

062 int ClearBiTree(BiTree *T)//清除树,同样为递归的方式 

063 { 

064     if ((*T)->lchild) 

065         ClearBiTree(&((*T)->lchild)); 

066     if ((*T)->rchild)     

067         ClearBiTree(&((*T)->rchild)); 

068       

069     if ((*T)->lchild == NULL && (*T)->rchild == NULL) 

070     { 

071         free(*T); 

072         *T = NULL; 

073     } 

074     return OK; 

075 } 

076   

077 int BiTreeEmpty(BiTree T)//判断树是否为空 

078 { 

079     if (T == NULL) 

080     return OK; 

081     return ERROR; 

082 } 

083   

084 int BiTreeDepth(BiTree T)//树的深度 

085 { 

086     int hl, hr; 

087     if (T == NULL) 

088     return 0; 

089     else 

090     { 

091     hl = BiTreeDepth(T->lchild); 

092     hr = BiTreeDepth(T->rchild); 

093     if (hl > hr) 

094         return hl + 1; 

095     else 

096         return hr + 1; 

097     } 

098 } 

099   

100 BitNode Root(BiTree T)//返回树的根(节点) 

101 { 

102     if (T == NULL) 

103     { 

104         printf("No Root"); 

105         exit(0); 

106     } 

107     return *T; 

108 } 

109   

110 int InserInc(BiTree *T, Type e)//按照字母序插入节点 (小于该节点的为其左子树,大于该节点的为其右子树) 

111 { 

112     BiTree temp; 

113       

114     temp = (BiTree)malloc(sizeof(BitNode)); 

115     temp->data = e; 

116       

117     if (*T == NULL) 

118     { 

119     temp->lchild = NULL; 

120     temp->rchild = NULL; 

121     *T = temp; 

122     } 

123     else 

124     { 

125     if (e < (*T)->data) 

126         InserInc(&((*T)->lchild), e); 

127     else 

128         InserInc(&((*T)->rchild), e); 

129     } 

130     return OK; 

131 } 

132   

133   

134 BiTree Search(BiTree T, Type p)//返回值为p的节点,否则为空 

135 { 

136     BiTree temp; 

137     if (T == NULL) 

138     return ERROR; 

139     else 

140     { 

141     if (T->data == p) 

142         return T; 

143     else 

144     { 

145         temp = Search(T->lchild, p); 

146         if (temp == NULL) 

147         temp = Search(T->rchild, p); 

补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,