生活中我们常常能够看到树。树枝会有很多分叉,这些分叉会再次分叉等。而我们的二叉树形似这一棵棵树,不过它的每个树杈都是两个。如下图。
今天我们就是实现一下二叉树的基本操作。
在实现之前,我们要理解二叉树的所有操作的核心都是 递归!!!
所以在实现的时候,首先就要想到的思想就是递归思想。
二叉树的遍历方式
二叉树的遍历方式有四种(基于上图):
- 先序遍历:a b d e c f g
- 中序遍历:d b e a f c g
- 后序遍历:d e b f g c a
- 层序遍历:a b c d e f g
实现
首先,我们先定义每个二叉树的节点。
//这里我们用孩子表示法来定义
typedef struct TreeNode{
TreeNodeType data;//数据
struct TreeNode* lchild;//左子树
struct TreeNode* rchild;//右子树
}TreeNode;
初始化二叉树
//初始化
void TreeInit(TreeNode** root)
{
if(root == NULL) {
return;
}
*root = NULL;
}
遍历
//先序
void TreePreOrder(TreeNode* root)
{
if(root == NULL) {
return;//空树
}
printf("%c ", root->data);//访问根节点
TreePreOrder(root->lchild);//递归遍历左子树
TreePreOrder(root->rchild);//递归遍历右子树
}
//中序
void TreeInOrder(TreeNode* root)
{
if(root == NULL) {
return;//空树
}
TreeInOrder(root->lchild);//递归遍历左子树
printf("%c ", root->data);//访问根节点
TreeInOrder(root->rchild);//递归遍历右子树
}
//后序
void TreePostOrder(TreeNode* root)
{
if(root == NULL) {
return;//空树
}
TreePostOrder(root->lchild);//递归遍历左子树
TreePostOrder(root->rchild);//递归遍历右子树
printf("%c ", root->data);//访问根节点
}
//层序
//实现层序遍历的时候,由于递归并不能够很好的实现。
//这里我们先使用循环的方式来实现。
//引入一个队列进行操作。
void TreeLevelOrder(TreeNode* root)
{
if(root == NULL) {
return;
}
SeqQueue queue;//定义队列
SeqQueueType front;
SeqQueueInit(&queue);//初始化队列
SeqQueuePush(&queue, root);//入队列
while(1) {
SeqQueueGetFront(&queue, &front);//取队首
if(front == NULL) {
return;
}
printf("%c ", front->data);
if(front->lchild != NULL) {
SeqQueuePush(&queue, front->lchild);
}
if(front->rchild != NULL) {
SeqQueuePush(&queue, front->rchild);
}
SeqQueuePop(&queue);
}
}
创建与销毁二叉树
这里创建二叉树我们利用先序遍历的结果来创建二叉树,但是这个结果必须得有空间点的位置,才可以创建一个唯一的二叉树。否则无法创建。
//创建二叉树
TreeNode* CreatTreeNode(TreeNodeType value)//创建节点
{
TreeNode* new_node = (TreeNode*)malloc(sizeof(TreeNode));
new_node->data = value;
new_node->lchild = NULL;
new_node->rchild = NULL;
}
TreeNode*_TreeCreat(TreeNodeType array[], size_t size, size_t* index, TreeNodeType nullnode)//辅助函数
{
if(array == NULL || size == 0) {
return NULL;
}
if((*index) >= size) {
return NULL;
}
TreeNode* root = CreatTreeNode(array[*index]);
(*index)++;
root->lchild = _TreeCreat(array, size, index, null_node);
(*index)++;
root->rchild = _TreeCreat(array, size, index, null_node);
return root;
}
TreeNode* TreeCreat(TreeNodeType array[], size_t size, TreeNodeType null_node)
{
if(array == NULL || size == 0) {
return NULL;
}
size_t index = 0;
_TreeCreat(array, size, &index, nullnode);
}
//销毁
void TreeNodeDestroy(TreeNode** root)
{
if(root == NULL) {
return;
}
*root = NULL;
}
void TreeDestroy(TreeNode* root)
{
if(root == NULL) {
return;
}
TreeDestroy(root->lchild);//利用后序遍历进行销毁
TreeDestroy(root->rchild);
TreeNodeDestroy(root);
}
欢迎大家共同讨论,如有错误及时联系作者指出,并改正。谢谢大家!