voidinitBinaryTree(HjBiTree biTree){
for (int i = 0; i < MAX_NODE_SIZE; i++) {
//每个节点置空
biTree[i] = Nil;
}
}
2、按层序给二叉树的节点赋值
Status createBinaryTree(HjBiTree biTree){
int i = 0;
for (; i < 10; i++) {
biTree[i] = i + 1;
if (i != 0 && biTree[i] != Nil) {
if (biTree[(i + 1) / 2 - 1] == Nil) {
return ERROR;
}
}
}
while (i < MAX_NODE_SIZE) {
biTree[i] = Nil;
i++;
}
return OK;
}
3、层序遍历
voidprintfNode(ElemType data){
printf("%d ",data);
}
voidlevelOrderTraverse(HjBiTree biTree){
printf("层序遍历:");
for (int i = 0; i < MAX_NODE_SIZE; i++) {
ElemType data = biTree[i];
if (data != Nil) {
printfNode(data);
}
}
printf("\n");
}
4、前序遍历
voidpreTraverse(HjBiTree biTree, int index){
if (index >= MAX_NODE_SIZE || index < 0) {
return;
}
ElemType data = biTree[index];
if (data != Nil) {
printfNode(data);
preTraverse(biTree, index * 2 + 1);
preTraverse(biTree, index * 2 + 2);
}
}
voidpreOrderTraverse(HjBiTree biTree){
printf("前序遍历:");
preTraverse(biTree, 0);
printf("\n");
}
5、中序遍历
voidinTraverse(HjBiTree biTree, int index){
if (index >= MAX_NODE_SIZE || index < 0) {
return;
}
ElemType data = biTree[index];
if (data != Nil) {
inTraverse(biTree, index * 2 + 1);
printfNode(data);
inTraverse(biTree, index * 2 + 2);
}
}
voidinOrderTraverse(HjBiTree biTree){
printf("中序遍历:");
inTraverse(biTree, 0);
printf("\n");
}
6、后序遍历
voidpostTraverse(HjBiTree biTree, int index){
if (index >= MAX_NODE_SIZE || index < 0) {
return;
}
ElemType data = biTree[index];
if (data != Nil) {
postTraverse(biTree, index * 2 + 1);
postTraverse(biTree, index * 2 + 2);
printfNode(data);
}
}
voidpostOrderTraverse(HjBiTree biTree){
printf("后序遍历:");
postTraverse(biTree, 0);
printf("\n");
}
7、判断树是否是空树
Status isBiTreeEmpty(HjBiTree biTree){
//根结点为空,则二叉树为空return biTree[0] == Nil;
}
8、获取二叉树的深度
intgetBiTreeDepth(HjBiTree biTree){
int i = MAX_NODE_SIZE - 1;
for (; i >= 0; i --) {
if (biTree[i] != Nil) {
break;;
}
}
int j = -1;
do {
j++;
} while (pow(2, j) <= i);
return j;
}
9 返回处于位置pos的结点值
//(层从1开始,序号从1开始)ElemType getNodeValue(HjBiTree biTree,Position pos){
int index = pow(2, pos.level - 1) - 2;
index += pos.order;
if (index >= MAX_NODE_SIZE || index < 0) {
return Nil;
}
return biTree[index];
}
10、获取二叉树根结点的值
Status getRootNode(HjBiTree biTree, ElemType *data){
if (isBiTreeEmpty(biTree)) {
return ERROR;
}
*data = biTree[0];
return OK;
}
11、给处于位置pos的结点赋值
Status setValueForPos(HjBiTree biTree,Position pos,ElemType data){
int index = pow(2, pos.level - 1) - 2;
index += pos.order;
if (index >= MAX_NODE_SIZE || index < 0) {
return ERROR;
}
biTree[index] = data;
return OK;
}
12、获取节点的双亲的值
ElemType getParentValue(HjBiTree biTree, ElemType data){
if (biTree[0] == Nil) {
return Nil;
}
for (int i = 1 ; i < MAX_NODE_SIZE; i++) {
if (biTree[i] == data) {
return biTree[ (i + 1) / 2 - 1];
}
}
return Nil;
}
13、获取某个结点的左孩子的值
ElemType getLeftChild(HjBiTree biTree,ElemType data){
if (biTree[0] == Nil) {
return Nil;
}
for (int i = 0; i < MAX_NODE_SIZE; i++) {
if (biTree[i] == data) {
int leftChildIndex = i * 2 + 1;
if (leftChildIndex < MAX_NODE_SIZE) {
return biTree[leftChildIndex];
}
}
}
return Nil;
}
14、获取某个结点的右孩子的值
ElemType getRightChild(HjBiTree biTree,ElemType data){
if (biTree[0] == Nil) {
return Nil;
}
for (int i = 0; i < MAX_NODE_SIZE; i++) {
if (biTree[i] == data) {
int rightChildIndex = i * 2 + 2;
if (rightChildIndex < MAX_NODE_SIZE) {
return biTree[rightChildIndex];
}
}
}
return Nil;
}
intgetBinaryTreeDepth(HjBiTree biTree){
if (!biTree) {
return0;
}
int i = 0;
int j = 0;
if (biTree->leftChild) {
i = getBinaryTreeDepth(biTree->leftChild);
}
if (biTree->rightChild) {
j = getBinaryTreeDepth(biTree->rightChild);
}
return i > j ? i + 1 : j + 1;
}
5、前序遍历
voidpreTraverse(HjBiTree biTree){
if (!biTree) {
return;
}
ElemType data = biTree->data;
if (data != Nil) {
printfNode(data);
preTraverse(biTree->leftChild);
preTraverse(biTree->rightChild);
}
}
6、中序遍历
voidinTraverse(HjBiTree biTree){
if (!biTree) {
return;
}
ElemType data = biTree->data;
if (data != Nil) {
inTraverse(biTree->leftChild);
printfNode(data);
inTraverse(biTree->rightChild);
}
}
7、后序遍历
voidpostTraverse(HjBiTree biTree){
if (!biTree) {
return;
}
ElemType data = biTree->data;
if (data != Nil) {
postTraverse(biTree->leftChild);
postTraverse(biTree->rightChild);
printfNode(data);
}
}
其它辅助代码
#include"stdlib.h"#include"math.h"#include"time.h"#include"string.h"#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0//状态码typedefint Status;
#define MAX_SIZE 100//定义二叉树字符串,0号单元存长度typedefchar String[MAX_SIZE];
Status assignString(String str, char *chars){
long length = strlen(chars);
if (length > MAX_SIZE) {
return ERROR;
}
str[0] = length;
for (int i = 1; i <= length; i++) {
// str[i] = chars[i - 1];
str[i] = *(chars + i - 1);
}
return OK;
}
intmain(int argc, constchar * argv[]){
printf("---二叉树链式存储结构实现!---\n");
HjBiTree biTree;
String str;
int index = 1;
initBinaryTree(&biTree);
assignString(str,"ABDH#K###E##CFI###G#J##");
printf("创建二叉树:%s",str);
createBinaryTree(&biTree, str, &index);
printf("\n二叉树的深度:%d",getBinaryTreeDepth(biTree));
printf("\n前序遍历二叉树:");
preTraverse(biTree);
printf("\n中序遍历二叉树:");
inTraverse(biTree);
printf("\n后序遍历二叉树:");
postTraverse(biTree);
printf("\n");
return0;
}