数据结构之二叉树的基本操作(遍历、创建、销毁)

生活中我们常常能够看到树。树枝会有很多分叉,这些分叉会再次分叉等。而我们的二叉树形似这一棵棵树,不过它的每个树杈都是两个。如下图。
这里写图片描述
今天我们就是实现一下二叉树的基本操作。
在实现之前,我们要理解二叉树的所有操作的核心都是 递归!!!
所以在实现的时候,首先就要想到的思想就是递归思想。

二叉树的遍历方式

二叉树的遍历方式有四种(基于上图):

  1. 先序遍历:a b d e c f g
  2. 中序遍历:d b e a f c g
  3. 后序遍历:d e b f g c a
  4. 层序遍历: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);
}

欢迎大家共同讨论,如有错误及时联系作者指出,并改正。谢谢大家!

猜你喜欢

转载自blog.csdn.net/liuchenxia8/article/details/80135888