typedef char BTDataType;
typedef struct BinaryTreeNode
{
BTDataType _data;
struct BinaryTreeNode* _left;
struct BinaryTreeNode* _right;
}BTNode;
BTNode* BinaryTreeCreate(BTDataType* a, int n, int* pi);
void BinaryTreeDestory(BTNode** root);
int BinaryTreeSize(BTNode* root);
int BinaryTreeLeafSize(BTNode* root);
int BinaryTreeLevelKSize(BTNode* root, int k);
BTNode* BinaryTreeFind(BTNode* root, BTDataType x);
void BinaryTreePrevOrder(BTNode* root);
void BinaryTreeInOrder(BTNode* root);
void BinaryTreePostOrder(BTNode* root);
void BinaryTreeLevelOrder(BTNode* root);
int BinaryTreeComplete(BTNode* root);
BTNode* BinaryTreeCreate(BTDataType* a, int n, int* pi)
{
assert(a);
if (*pi > n)
return NULL;
if (a[*pi] == '#')
{
(*pi)++;
return NULL;
}
BTNode* newNode = (BTNode*)malloc(sizeof(BTNode));
if (newNode == NULL)
{
exit(-1);
}
newNode->_data = a[(*pi)++];
newNode->_left = BinaryTreeCreate(a, n, pi);
newNode->_right = BinaryTreeCreate(a, n, pi);
return newNode;
}
void BinaryTreePrint(BTNode* root)
{
if (root == NULL)
return;
printf("%c ",root->_data);
BinaryTreePrint(root->_left);
BinaryTreePrint(root->_right);
}
void BinaryTreeDestory(BTNode** root)
{
if (root == NULL)
return;
BinaryTreeDestory((*root)->_left);
BinaryTreeDestory((*root)->_right);
free(root);
root = NULL;
}
int BinaryTreeSize(BTNode* root)
{
if (root == NULL)
return 0;
return BinaryTreeSize(root->_left) + BinaryTreeSize(root->_right) + 1;
}
int BinaryTreeLeafSize(BTNode* root)
{
if (root == NULL)
return 0;
if (root->_left == NULL&&root->_right == NULL)
return 1;
return BinaryTreeLeafSize(root->_left) + BinaryTreeLeafSize(root->_right);
}
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
if (root == NULL)
return NULL;
if (root->_data == x)
return root;
struct BinaryTreeNode* newleft = BinaryTreeFind(root->_left, x);
if (newleft)
return newleft;
struct BinaryTreeNode* newright= BinaryTreeFind(root->_right, x);
if (newright)
return newright;
return NULL;
}
int BinaryTreeLevelKSize(BTNode* root, int k)
{
assert(k >= 1);
if (k == 1)
return 1;
if (root==NULL)
return 0;
return BinaryTreeLevelKSize(root->_left, k-1) + BinaryTreeLevelKSize(root->_right, k-1);
}
void BinaryTreePrevOrder(BTNode* root)
{
if (root == NULL)
{
return;
}
printf("%c ", root->_data);
BinaryTreePrevOrder(root->_left);
BinaryTreePrevOrder(root->_right);
}
void BinaryTreeInOrder(BTNode* root)
{
if (root == NULL)
{
return;
}
BinaryTreeInOrder(root->_left);
printf("%c ", root->_data);
BinaryTreeInOrder(root->_right);
}
void BinaryTreePostOrder(BTNode* root)
{
if (root == NULL)
return ;
BinaryTreePostOrder(root->_left);
BinaryTreePostOrder(root->_right);
printf("%c ", root->_data);
}
void BinaryTreeLevelOrder(BTNode* root)
{
QuState qu;
QueueInit(&qu);
QueuePush(&qu, root);
while (QueueEmpty(&qu))
{
QDataType cur = QueueTop(&qu);
printf("%c ", cur->_data);
QueuePop(&qu);
if (cur->_left)
QueuePush(&qu, cur->_left);
if (cur->_right)
QueuePush(&qu, cur->_right);
}
printf("\n");
QueueDestroyed(&qu);
}
bool BinaryTreeComplete(BTNode* root)
{
QuState qu;
QueueInit(&qu);
QueuePush(&qu, root);
while (QueueEmpty(&qu))
{
BTNode* cur = QueueTop(&qu);
QueuePop(&qu);
if (cur == NULL)
{
break;
}
else
{
QueuePush(&qu,cur->_left);
QueuePush(&qu,cur->_right);
}
}
while (QueueEmpty(&qu))
{
QDataType* cur = QueueTop(&qu);
QueuePop(&qu);
if (cur)
{
QueueDestroy(&qu);
return false;
}
}
QueueDestroy(&qu);
return true;
}