前面已经展示过一些二叉树的基本概念,接下来基于链表的存储结构实现一个链式二叉树。
此处是通过递归的方法创建。
//链式存储方式--孩子表示法
typedef char Datatype;
typedef struct BTnode {
struct BTnode* Left;
struct BTnode* Right;
Datatype data;
}BTnode;
//创建节点
BTnode* CreatNewNode(Datatype data) {
BTnode* NewNode = (BTnode *)malloc(sizeof(BTnode));
if (NewNode == NULL) {
return;
}
NewNode->data = data;
NewNode->Right = NULL;
NewNode->Left = NULL;
return NewNode;
}
//创建树-有索引(用户不需要知道index,这个参数,在外面再加一层“外壳”)
BTnode* InCreatBinaryTree(Datatype* array, int size,int* index, Datatype invalid) {
BTnode* Root = NULL;
if (*index < size && array[*index]!=invalid) {
//创建根
Root = CreatNewNode(array[*index]);
//创建左子树
++(*index);
Root->Left = InCreatBinaryTree(array, size, index,invalid);
//创建右子树
++(*index);
Root->Right = InCreatBinaryTree(array, size, index, invalid);
}
return Root;
}
//创建树-封装InCreatBinaryTree()函数
//创建时array的输入(没有节点的地方输入非字母字符):char* str = "abd###ce##f";
BTnode* CreatBinaryTree(Datatype* array, int size,Datatype invalid) {
int index = 0;
return InCreatBinaryTree(array, size, &index, invalid);
}
以下是二叉树的基本操作
// 二叉树的销毁
void DestroyBinTree(BTnode** root) {
if (root) {
DestroyBinTree((*root)->Left);
DestroyBinTree((*root)->Right);
free(*root);
*root = NULL;
}
}
//前序遍历
void PreOrder(BTnode* root) {
if (root) {
printf("%c ",root->data);
PreOrder(root->Left);
PreOrder(root->Right);
}
}
// 中序遍历
void InOrder(BTnode* root) {
if (root) {
InOrder(root->Left);
printf("%c ", root->data);
InOrder(root->Right);
}
}
// 后序遍历
void PostOrder(BTnode* root) {
if (root) {
PostOrder(root->Left);
PostOrder(root->Right);
printf("%c ", root->data);
}
}
// 层序遍历
void LevelOrder(BTnode* root) {
Queue q;
if (root==NULL) {
return NULL;
}
QueueInit(&q);
QueuePush(&q, root);
while (QueueEmpty(&q)!=1) { //QueueEmpty函数,空返回1,不空返回0
BTnode* tmp = QueueFront(&q);
printf("%c ", tmp->data);
if (tmp->Left!= NULL) {
QueuePush(&q, tmp->Left);
}
if (tmp->Right!= NULL) {
QueuePush(&q, tmp->Right);
}
QueuePop(&q);
}
printf("\n");
}
// 获取二叉树中节点个数
int GetBinTreeSize(BTnode* root) {
if (root==NULL) {
return 0;
}
return GetBinTreeSize(root->Left) + GetBinTreeSize(root->Right) + 1;
}
// 获取二叉树中第K层节点个数
int GetKLevelNodeCount(BTnode* root, int K) {
if (root == NULL||K<=0) {
return 0;
}
if (K == 1) {
return 1;
}
return GetKLevelNodeCount(root->Left, K - 1) + GetKLevelNodeCount(root->Right, K - 1);
}
// 获取二叉树中叶子节点个数
int GetLeafCount(BTnode* root) {
if (root == NULL) {
return 0;
}
if (root->Left == NULL && root->Right == NULL) {
return 1;
}
return GetLeafCount(root->Left) + GetLeafCount(root->Right);
}
// 获取二叉树深度(高度)
int GetBinTreeHeight(BTnode* root) {
if (root == NULL) {
return 0;
}
int lefthight = GetBinTreeHeight(root->Left);
int righthight = GetBinTreeHeight(root->Right);
return lefthight >= righthight ? lefthight + 1:righthight + 1;
}
// 检测值为x的元素是否在二叉树中,在返回该节点的地址,否NULL
BTnode* BinaryTreeFind(BTnode* root, Datatype x) {
if (root == NULL) {
return NULL;
}
if (root->data == x) {
return root;
}
BTnode* node = NULL;
if (node = BinaryTreeFind(root->Left,x)) {
return node;
}
return BinaryTreeFind(root->Right,x);
}
// 二叉树的镜像
void Mirror(BTnode* root) {
if (root) {
Swap(&root->Left, &root->Right);
Mirror(root->Left);
Mirror(root->Right);
}
}