BinTree.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include "Queue.h"
typedef char BTDataType;
typedef struct BinTreeNode
{
struct BinTreeNode *pLeft;
struct BinTreeNode *pRight;
BTDataType _data;
}BTNode, *PBTNode;
PBTNode BuyBinTreeNode(BTDataType data);
void _CreateBinTree(PBTNode* pRoot, const BTDataType*
array, int size, int* index, BTDataType invalid);
void CreateBinTree(PBTNode* pRoot, const BTDataType*
array, int size, BTDataType invalid);
void DestroyBinTree(PBTNode *pRoot);
BinTree.c
// 创建二叉树
void _CreateBinTree(PBTNode* pRoot, const BTDataType* array, int size, int* index, BTDataType invalid)
{
assert(pRoot);
assert(index);
if (invalid != array[*index] && (*index) < size)
{
*pRoot = BuyBinTreeNode(array[*index]);
++(*index);
_CreateBinTree(&(*pRoot)->pLeft, array, size, index, invalid);
++(*index);
_CreateBinTree(&(*pRoot)->pRight, array, size, index, invalid);
}
}
void CreateBinTree(PBTNode* pRoot, const BTDataType* array, int size, BTDataType invalid)
{
int index = 0;
_CreateBinTree(pRoot, array, size, &index, invalid);
}
// 构建二叉树的结点
PBTNode BuyBinTreeNode(BTDataType data)
{
PBTNode pNewNode = NULL;
pNewNode = (PBTNode)malloc(sizeof(BTNode));
if (NULL == pNewNode)
{
assert(0);
return NULL;
}
pNewNode->_data = data;
pNewNode->pLeft = NULL;
pNewNode->pRight = NULL;
return pNewNode;
}
// 销毁二叉树
void DestroyBinTree(PBTNode *pRoot)
{
assert(pRoot);
if (NULL == *pRoot)
return;
else
{
//如果左子树存在,销毁左子树
if ((*pRoot)->pLeft)
{
DestroyBinTree(&(*pRoot)->pLeft);
}
//如果右子树存在,销毁右子树
if ((*pRoot)->pRight)
{
DestroyBinTree(&(*pRoot)->pRight);
}
//销毁树根
free(*pRoot);
*pRoot = NULL;
}
}
//测试
void TestCreate()
{
PBTNode pRoot = NULL;
BTDataType str[] = "ABD###CE##F";
CreateBinTree(&pRoot, str, strlen(str), '#');
DestroyBinTree(&pNewRoot);
}