接口
typedef char BTDataType;
typedef struct BinaryTreeNode {
BTDataType _data;
struct BinaryTreeNode* _left;
struct BinaryTreeNode* _right;
}BTNode;
// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
BTNode* BinaryTreeCreate(BTDataType* a, 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);
实现
#include "BinaryTree.h"
// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
BTNode* BinaryTreeCreate(BTDataType* a, int* pi){
if (a[*pi] != '#'){
//创建根节点
BTNode* root = (BTNode*)malloc(sizeof(BTNode));
root->_data = a[*pi];
//创建左节点
(*pi)++;
root->_left = BinaryTreeCreate(a, pi);
//创建右节点
(*pi)++;
root->_right = BinaryTreeCreate(a, pi);
return root;
}
else
return NULL;
}
//想要把指针置空, 需要传二级指针, (传的是指针的copy)
void BinaryTreeDestory(BTNode** root){
if (*root){
BinaryTreeDestory(&(*root)->_left);
BinaryTreeDestory(&(*root)->_right);
free(*root);
*root = NULL;
}
}
//有效节点的个数
int BinaryTreeSize(BTNode* root){
if (root != NULL){
return BinaryTreeSize(root->_left) +
BinaryTreeSize(root->_right) + 1;
}
else
return 0;
}
//叶子的个数
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);
}
//第 k 层的节点个数
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);
}
//找到 x
BTNode* BinaryTreeFind(BTNode* root, BTDataType x){
BTNode* ret;
if (root == NULL){
return NULL;
}
//根节点
if (root->_data == x){
return root;
}
//找左子树
ret = BinaryTreeFind(root->_left, x);
if (ret){
return ret;
}
//左子树找不到, 找右子树
ret = BinaryTreeLeafSize(root->_right, x);
if (ret){
return ret;
}
//没找到
return NULL;
}
//前序 遍历
void BinaryTreePrevOrder(BTNode* root){
//先打印根节点
//访问根的左子树
//访问根的右子树
if (root){
printf("%c ", root->_data);
BinaryTreePrevOrder(root->_left);
BinaryTreePrevOrder(root->_right);
}
}
//中序遍历
void BinaryTreeInOrder(BTNode* root){
if (root){
BinaryTreeInOrder(root->_left);
printf("%c ", root->_data);
BinaryTreeInOrder(root->_right);
}
}
//后序遍历
void BinaryTreePostOrder(BTNode* root){
if (root){
BinaryTreePostOrder(root->_left);
BinaryTreePostOrder(root->_right);
printf("%c ", root->_data);
}
}