实现二叉树顺序存储java_二叉树的顺序存储C+Java

1 #include

2 #include "stdlib.h"

3 #include "io.h"

4 #include "math.h"

5 #include "time.h"

6

7 #define MAXSIZE 100

8 #define MAX_TREE_SIZE 100

9 typedef int Status; /*Status是函数的类型,其值是函数结果状态代码,如OK等*/

10 typedef int TElemType; /*树结点的数据类型,目前暂定为整型*/

11 typedef int SqBiTree[MAX_TREE_SIZE];/*0号单元存储根结点*/

12

13 typedef struct{14 /*结点的层,本层序号(按满二叉树计算)*/

15 intlevel,order;16 }Position;17

18 //假设整数0代表为空

19 int Nil = 0;20

21 //构造空的二叉树,因为T是固定数组,不会改变,故不需要&

22 Status InitBiTree(SqBiTree T){23 inti;24 for(i=0; i

26 }27 return 1;28 }29

30 //按层序次序输入二叉树的节点的值(字符型或整形),构造顺序存储二叉树

31 Status CreateBiTree(SqBiTree T){32 int i =0;33 printf("请按层序输入结点的值(整型),0表示空结点,输999结束。结点数≤%d:\n",MAX_TREE_SIZE);34 while(i<=10){35 T[i] = i+1;36 if(i!=0&&T[(i+1)/2-1] == Nil&&T[i]!=Nil){37 printf("出现了无双亲且非根节点%d\n",T[i]);38 exit(0);39 }40 i++;41 }42 //然后将后面的值赋值为空

43 while(i

50 //清空二叉树,在顺序存储中,两函数完全一样

51 #define ClearBiTree InitBiTree

52

53 /*初始条件: 二叉树T存在*/

54 /*操作结果: 若T为空二叉树,则返回TRUE,否则FALSE*/

55 Status BiTreeEmpty(SqBiTree T){56 if(T[0] ==Nil){57 return 1;58 }59 return 0;60 }61

62 /*初始条件: 二叉树T存在。操作结果: 返回T的深度*/

63 Status BiTreeDepth(SqBiTree T){64 //性质2:深度为k的二叉树至多有2^k个节点

65 int k = 0;66 while(powl(2,k)<=(10+1)){67 k++;68 }69 returnk;70 }71

72 /*初始条件: 二叉树T存在*/

73 /*操作结果: 当T不空,用e返回T的根,返回OK;否则返回ERROR,e无定义*/

74 Status Root(SqBiTree T){75 TElemType root;76 if(BiTreeEmpty(T)){77 return 0;78 }else{79 root = T[0];80 returnroot;81 }82 }83

84 /*初始条件: 二叉树T存在,e是T中某个结点(的位置)*/

85 /*操作结果: 返回处于位置e(层,本层序号)的结点的值*/

86 Status Value(SqBiTree T,Position e){87 if(e.order <= powl(2,e.level-1)) //不超过每层的节点数

88 return T[(int)powl(2,e.level-1)+e.order-2];89 else

90 return 0;91 }92

93 /*初始条件: 二叉树T存在,e是T中某个结点(的位置)*/

94 /*操作结果: 给处于位置e(层,本层序号)的结点赋新值value*/

95 Status Assign(SqBiTree T,Position e,TElemType value){96 int index = (int)powl(2,e.level-1)+e.order-2;97 //值不为空,且双亲节点不存在时

98 if(value!= Nil&&T[(index+1)/2-1]==Nil){99 return 0;100 }101 /*给双亲赋空值但有叶子*/

102 else if(value == Nil && (T[index*2+1]!=Nil || T[index*2+2]!=Nil)){103 return 0;104 }105 T[index] =value;106 return 1;107 }108

109 //求一个节点的双亲节点

110 TElemType Parent(SqBiTree T,Position e){111 int index = 0;112 index = (int)powl(2,e.level-1)+e.order-2;113 //为空树或者只有根节点

114 if(T[0] == Nil ||(T[2*index+1]==Nil || T[2*index+2]==Nil)){115 return 0;116 }else{117 if(index%2==0)118 return T[index/2-1];119 else

120 return T[index/2];121 }122 return 0;123 }124

125 //求一个节点的左孩子节点

126 TElemType LeftChild(SqBiTree T,Position e){127 int index = 0;128 index = (int)powl(2,e.level-1)+e.order-2;129 if(T[0] == Nil ||(T[2*index+1]==Nil || T[2*index+2]==Nil)){130 return 0;131 }else{132 return T[2*index+1];133 }134 }135

136 //求一个节点的右孩子节点

137 TElemType RightChild(SqBiTree T,Position e){138 int index = 0;139 index = (int)powl(2,e.level-1)+e.order-2;140 if(T[0] == Nil ||(T[2*index+1]==Nil || T[2*index+2]==Nil)){141 return 0;142 }else{143 return T[2*index+2];144 }145 }146

147

148 //求一个节点的左兄弟节点

149 TElemType LeftSibling(SqBiTree T,Position e){150 int index = 0;151 index = (int)powl(2,e.level-1)+e.order-2;152 if(T[0] == Nil ||(T[2*index+1]==Nil || T[2*index+2]==Nil)){153 return 0;154 }else{155 if(index%2==0)156 return T[index-1];157 else

158 return 0;159 }160 }161

162 //求一个节点的左兄弟节点

163 TElemType RightSibling(SqBiTree T,Position e){164 int index = 0;165 index = (int)powl(2,e.level-1)+e.order-2;166 if(T[0] == Nil ||(T[2*index+1]==Nil || T[2*index+2]==Nil)){167 return 0;168 }else{169 if(index%2==0){170 return 0;171 }172 else

173 return T[index+1];174 }175 }176 //遍历

177 //先序遍历的原则(递归):

178 void PreTraverse(SqBiTree T,intindex){179 printf("%d",T[index]);180 if(T[2*index+1]!=Nil){181 PreTraverse(T,2*index+1);182 }183 if(T[2*index+2]!=Nil){184 PreTraverse(T,2*index+2);185 }186 }187 voidPreOrderTraverse(SqBiTree T){188 if(!BiTreeEmpty(T)){189 PreTraverse(T,0);190 }191 printf("\n");192 }193

194 //中序遍历原则:

195 void InTraverse(SqBiTree T,intindex){196

197 if(T[2*index+1]!=Nil){198 InTraverse(T,2*index+1);199 }200 printf("%d",T[index]);201 if(T[2*index+2]!=Nil){202 InTraverse(T,2*index+2);203 }204 }205 voidInOrderTraverse(SqBiTree T){206 if(!BiTreeEmpty(T)){207 InTraverse(T,0);208 }209 printf("\n");210 }211

212 //后序遍历原则:

213 void PostTraverse(SqBiTree T,intindex){214

215 if(T[2*index+1]!=Nil){216 PostTraverse(T,2*index+1);217 }218 if(T[2*index+2]!=Nil){219 PostTraverse(T,2*index+2);220 }221 printf("%d",T[index]);222 }223 voidPostOrderTraverse(SqBiTree T){224 if(!BiTreeEmpty(T)){225 PostTraverse(T,0);226 }227 printf("\n");228 }229

230

231

232 intmain(){233

234 SqBiTree T;235 InitBiTree(T);236 //创建二叉树

237 CreateBiTree(T);238

239 //判断是否为空

240 printf("二叉树是否为空:%d\n",BiTreeEmpty(T));241

242 //清空二叉树后243 //判断是否为空

244 printf("二叉树是否为空:%d\n",ClearBiTree(T));245 //重新创建二叉树

246 CreateBiTree(T);247

248 //树的深度

249 printf("树的深度:%d\n",BiTreeDepth(T));250

251 //树根

252 printf("树的根节点:%d\n",Root(T));253

254 //寻找某一层某个特地的元素

255 Position e;256 e.level = 2;257 e.order = 2;258 printf("2层第2个是:%d\n",Value(T,e));259

260 //修改节点元素

261 Assign(T,e,50);262 printf("2层第2个是:%d\n",Value(T,e));263

264 //求节点双亲

265 printf("2层第2个的双亲是:%d\n",Parent(T,e));266

267 //求节点左孩子

268 printf("2层第2个的左孩子是:%d\n",LeftChild(T,e));269

270 //求节点右孩子

271 printf("2层第2个的左孩子是:%d\n",RightChild(T,e));272

273

274 //求节点左兄弟

275 printf("2层第2个的左兄弟是:%d\n",LeftSibling(T,e));276 //求节点右兄弟

277 printf("2层第2个的右兄弟是:%d\n",RightSibling(T,e));278

279

280 //先序遍历

281 printf("先序遍历\n");282 PreOrderTraverse(T);283

284 //中序遍历

285 printf("中序遍历\n");286 InOrderTraverse(T);287

288 //后序遍历

289 printf("后序遍历\n");290 PostOrderTraverse(T);291 return 0;292 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值