这里写自定义目录标题
前言
C语言实现二叉树,在某些基本操作中需要借助队列结构实现,C++可以不借助其他结构。
构造二叉树结点
BTNode* BinaryTreeCreate (BTDataType* str, int* pi)
{
if (str[*pi] == '#')
{
(*pi)++;
return NULL;
}
BTNode* root = (BTNode*)malloc(sizeof(BTNode));
if (root == NULL)
{
perror("malloc fail");
exit(-1);
}
root->data = str[(*pi)++];
root->left = BinaryTreeCreate(str, pi);
root->right = BinaryTreeCreate(str, pi);
return root;
}
二叉树销毁
void BinaryTreeDestory(BTNode** root)
{
if (root == NULL)
{
return;
}
BinaryTreeDestory(&((*root)->left));
BinaryTreeDestory(&((*root)->right));
free(*root);
*root = NULL;
}
二叉树节点个数
int BinaryTreeSize(BTNode* root)
{
return root == NULL ? 0 : BinaryTreeSize(root->right) + BinaryTreeSize(root->left)+1;
}
二叉树叶子节点个数
int BinaryTreeLeafSize(BTNode* root)
{
if (root == NULL)
{
return 0;
}
if (root->left == NULL && root->right == NULL)
{
return 1;
}
return BinaryTreeLeafSize(root->right) + BinaryTreeLeafSize(root->left);
}
二叉树第k层节点个数
int BinaryTreeLevelKSize(BTNode* root, int k)
{
if (root == NULL)
{
return 0;
}
if (k == 1)
{
return 1;
}
return BinaryTreeLevelKSize(root->right,k-1) + BinaryTreeLevelKSize(root->left,k-1);
}
二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
if (root == NULL)
{
return NULL;
}
if (root->data == x)
{
return root;
}
BTNode* left = BinaryTreeFind(root->left,x);
if (left)
{
return left;
}
BTNode* right = BinaryTreeFind(root->right, x);
if (right)
{
return right;
}
return NULL;
}
二叉树前序遍历
void BinaryTreePrevOrder(BTNode* obj)
{
if (obj == NULL)
{
return;
}
printf("%c ", obj->data);
BinaryTreePrevOrder(obj->left);
BinaryTreePrevOrder(obj->right);
}
二叉树中序遍历
void inorder(BTNode* obj)
{
if (obj == NULL)
{
return;
}
inorder(obj->left);
printf("%c ", obj->data);
inorder(obj->right);
}
二叉树后序遍历
void BinaryTreePostOrder(BTNode* obj