【数据结构】 模拟实现简单二叉树
引言:二叉树的提出给世界带来了很多的便利,但是作为数据结构重点和难点,想要完全弄透树还是很有挑战性的,STL中的map和set底层均为树型结构,还有数据结构公认难点红黑树和b树。今天我们来简单实现一个二叉树,从简单入手,摸清它。树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交。
二叉树概念及结构
概念:
一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。
特点:
- 1每个结点最多有两棵子树,即二叉树不存在度大于2的结点。
- 2二叉树的子树有左右之分,其子树的次序不能颠倒。
代码实现如下:
BinaryTree.h
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
typedef char BTDataType;
typedef struct BinaryTreeNode
{
struct BinaryTreeNode* left;
struct BinaryTreeNode* right;
BTDataType _data;
}BTNode;
//通过前序遍历的数组"ABD##E##CF##G##"构建二叉树
BTNode* BinaryTreeCreate(BTDataType* a, int* pi);
void BinaryTreeDestory(BTNode* root);
int BinaryTreeSize(BTNode* root);
int BinaryTreeLeafSize(BTNode* root);
int BinaryTreeLevelKSize(BTNode* root);
BTNode* BinaryTreeFind(BTNode* root, BTDataType x);
//前,中,后序遍历
void BinaryTreePrevorder(BTNode* root);
void BinaryTreeInorder(BTNode* root);
void BinaryTreePostorder(BTNode* root);
void TestBinaryTree();
BinaryTree.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"BinaryTree.h"
BTNode* BinaryTreeCreate(BTDataType* a, int* pi)
{
if (a[*pi] == '#')
{
return NULL;
}
BTNode* root = (BTNode*)malloc(sizeof(BTNode));
root->_data = a[*pi];
++(*pi);
root->left=BinaryTreeCreate(a, pi);
++(*pi);
root->right=BinaryTreeCreate(a, pi);
return root;
}
void BinaryTreeDestory(BTNode* root)
{
if (root == NULL)
return NULL;
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);
}
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);
}
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
if (root == NULL)
{
return NULL;
}
if (root->_data == x)
return root;
int lret = BinaryTreeFind(root->left, x);
if (root != NULL)
return lret;
int rret = BinaryTreeFind(root->right, x);
if (root != NULL)
return rret;
return NULL;
}
//前,中,后序遍历
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 ;
BinaryTreePrevorder(root->left);
printf("%c ", root->_data);
BinaryTreePrevorder(root->right);
}
void BinaryTreePostorder(BTNode* root)
{
if (root == NULL)
return ;
BinaryTreePrevorder(root->left);
BinaryTreePrevorder(root->right);
printf("%c ", root->_data);
}
void TestBinaryTree()
{
int i = 0;
char a[] = "ABD##E##CF##G##";
BTNode *root = NULL;
root=BinaryTreeCreate(a, &i);
BinaryTreePrevorder(root);
printf("\n");
BinaryTreeInorder(root);
printf("\n");
BinaryTreePostorder(root);
printf("\n");
int num1 = BinaryTreeSize(root);
printf("%d ", num1);
int num2 = BinaryTreeLeafSize(root);
printf("%d ", num2);
int num3 = BinaryTreeLevelKSize(root, 3);
printf("%d ", num3);
BTNode* num4 = BinaryTreeFind(root, 'D');
printf("%c ", num4->_data);
}
Test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"BinaryTree.h"
int main()
{
TestBinaryTree();
system("pause");
return 0;
}