1.定义数据结构
typedef char BTDataType;
typedef struct BinaryTreeNode
{
BTDataType _data;
struct BinaryTreeNode* _left;
struct BinaryTreeNode* _right;
}BTNode;
2.各个函数接口声明
BTNode* BuyBTNode(BTDataType x);
BTNode* BinaryTreeCreate(BTDataType* a, int n, int *pi);
void BinaryTreeDestroy(BTNode** newnode);
int BinaryTreeSize(BTNode* root);
void BinaryTreeSize_C(BTNode* root);
int BinaryTreeLeafSzie(BTNode* root);
void BinaryTreeLeafSzie_C(BTNode* root);
void BinaryTreePrevOrder_R(BTNode* root);
void BinaryTreeMidOrder_R(BTNode* root);
void BinaryTreePostOrder_R(BTNode* root);
int BinaryTreeHigh(BTNode* root);
BTNode* BinaryTreeFindParent(BTNode* root, BTDataType x);
int BinaryTreeLevelKSize(BTNode* root, int k);
3.函数实现
BTNode* BuyBTNode(BTDataType x)
{
BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
if (newnode != NULL)
{
newnode->_data = x;
newnode->_left = NULL;
newnode->_right = NULL;
}
return newnode;
}
BTNode* BinaryTreeCreate(BTDataType* a, int n, int *pi)
{
if (a[*pi] != '#')
{
BTNode* root = BuyBTNode(a[*pi]);
++(*pi);
root->_left = BinaryTreeCreate(a, n, pi);
++(*pi);
root->_right = BinaryTreeCreate(a, n, pi);
return root;
}
else
{
return NULL;
}
}
void BinaryTreeDestroy(BTNode** newnode)
{
BTNode* root = *newnode;
if (root == NULL)
{
return;
}
BinaryTreeDestroy(&root->_left);
BinaryTreeDestroy(&root->_right);
free(root);
root = NULL;
}
int BinaryTreeSize(BTNode* root)
{
if (root == NULL)
{
return 0;
}
return BinaryTreeSize(root->_left) + BinaryTreeSize(root->_right) + 1;
}
int size = 0;
void BinaryTreeSize_C(BTNode* root)
{
if (root == NULL)
{
return;
}
size++;
BinaryTreeSize_C(root->_left);
BinaryTreeSize_C(root->_right);
}
int BinaryTreeLeafSzie(BTNode* root)
{
if (root == NULL)
{
return 0;
}
if ((root->_left == NULL) && (root->_right == NULL))
{
return 1;
}
return BinaryTreeLeafSzie(root->_left) + BinaryTreeLeafSzie(root->_right);
}
void BinaryTreeLeafSzie_C(BTNode* root)
{
if (root == NULL)
{
return;
}
if ((root->_left == NULL) && (root->_right == NULL))
{
size++;
}
BinaryTreeLeafSzie_C(root->_left);
BinaryTreeLeafSzie_C(root->_right);
}
void BinaryTreePrevOrder_R(BTNode* root)
{
if (root == NULL)
{
return;
}
printf("%c", root->_data);
BinaryTreePrevOrder_R(root->_left);
BinaryTreePrevOrder_R(root->_right);
}
void BinaryTreeMidOrder_R(BTNode* root)
{
if (root == NULL)
{
return;
}
BinaryTreeMidOrder_R(root->_left);
printf("%c", root->_data);
BinaryTreeMidOrder_R(root->_right);
}
void BinaryTreePostOrder_R(BTNode* root)
{
if (root == NULL)
{
return;
}
BinaryTreePostOrder_R(root->_left);
BinaryTreePostOrder_R(root->_right);
printf("%c", root->_data);
}
int BinaryTreeHigh(BTNode* root)
{
if (root == NULL)
{
return 0;
}
int ret1 = BinaryTreeHigh(root->_left);
int ret2 = BinaryTreeHigh(root->_right);
return ret1 > ret2 ? ret1 + 1 : ret2 + 1;
}
BTNode* BinaryTreeFindParent(BTNode* root, BTDataType x)
{
if ((root == NULL) || (root->_data == x))
{
return NULL;
}
if (root->_left)
{
if (root->_left->_data == x)
{
return root;
}
}
if (root->_right)
{
if (root->_right->_data == x)
{
return root;
}
}
BTNode* ret = BinaryTreeFindParent(root->_left, x);
if (ret)
return ret;
ret = BinaryTreeFindParent(root->_right, x);
if (ret)
return ret;
return NULL;
}
int BinaryTreeLevelKSize(BTNode* root, int k)
{
if (root == NULL)
{
return 0;
}
if (k == 1)
{
return 1;
}
return BinaryTreeLevelKSize(root->_left, k - 1) + BinaryTreeLevelKSize(root->_right, k - 1);
}