借助队列实现二叉树

154 阅读2分钟

二叉树代码实现

1.实现逻辑

实现思路图:

image.png

借助队列实现二叉树,按插入顺序将节点将节点加入到队列,每次插入时读取队列的首元素将子节点从左往右挂到双亲节点上。右指针挂载之后出队。

代码实现:

#include <stdio.h>
#include <stdlib.h>
​
/**
 *树形结构
 */
typedef struct
{
    int data;
    struct Tree *leftPoint;
    struct Tree *rightPoint;
} Tree;
​
/**
 *节点链表
 */
typedef struct
{
    Tree *data;
    struct LinkNode *nextData;
} LinkNode;
​
/**
 * 节点队列
 */
typedef struct
{
    // 首节点
    LinkNode *fastNode;
    // 尾部节点
    LinkNode *lastNode;
} NodeQueue;
​
// 插入节点的队列
NodeQueue *queue;
​
/**
 * 创建链表节点
 * @param Tree* tree 树节点
 */
LinkNode* creatLinkNode(Tree *tree)
{
    LinkNode *node = (LinkNode *)malloc(sizeof(LinkNode));
    node->data = tree;
    node->nextData = NULL;
    return node;
}
​
/**
 * 初始化队列
 * @param Tree 二叉树根节点
 */
void initQueue(Tree *tree)
{
    // 为根节点创建链表节点
    LinkNode *linkNode = creatLinkNode(tree);
    queue = (NodeQueue *)malloc(sizeof(NodeQueue));
    queue->fastNode = linkNode;
    queue->lastNode = linkNode;
}
​
/**
 * 插入队列
 * @param LinkNode* 需要入队的节点
 */
void pushQueue(LinkNode *node)
{
    // 判断是否为队列的首个元素
    if (queue->fastNode == NULL)
    {
        queue->fastNode = node;
        queue->lastNode = node;
    }
    // 将队列最后一个节点的后一个指向需要插入的节点
    queue->lastNode->nextData = (struct LinkNode *)node;
    // 将当前节点设置为最后一个节点
    queue->lastNode = node;
}
​
/**
 *队列出队
 */
LinkNode* popQueue()
{
    // 取出队列的队首节点
    LinkNode *node = queue->fastNode;
    // 设置队列的队首节点
    queue->fastNode = (LinkNode *)node->nextData;
    return node;
}
​
/**
 * 创建树节点
 * @param int data 树节点的值
*/
Tree* creatTreeNode(int data)
{
    Tree *tree = (Tree *)malloc(sizeof(Tree));
    tree->data = data;
    tree->leftPoint = NULL;
    tree->rightPoint = NULL;
    return tree;
}
​
​
/**
 * 插入节点
 * @param Tree node 需要插入的树节点
 */
void insertNode(Tree *node)
{
    // 为当前孩子创建链表节点
    LinkNode *linkNode = creatLinkNode(node);
    // 获取当前插入队列队首节点
    Tree *tree = queue->fastNode->data;
    // 判断插入到节点的左孩子还是右孩子
    if (tree->leftPoint == NULL)
    {
        tree->leftPoint = (struct Tree *)node;
    }
    else if (tree->rightPoint == NULL)
    {
        tree->rightPoint = (struct Tree *)node;
        // 当右孩子插入完成时 说明当前节点左右孩子都已经存在 将节点从队列中出队
        popQueue();
    }
    // 将当前孩子加入到队列中
    pushQueue(linkNode);
}
​
/**
 * 前序遍历二插树
 * @param Tree tree 二插树根节点
 */
void printfTree(Tree *tree)
{
    if (tree == NULL)
        return;
    printf("data->%d   ", tree->data);
    printfTree((Tree *)tree->leftPoint);
    printfTree((Tree *)tree->rightPoint);
}
​
int main(int argc, char const *argv[])
{
​
    //  创建树的根节点
    Tree *tree = creatTreeNode(0);
    // 初始化队列 将根节点加入到队列中
    initQueue(tree);
    for (int i = 0; i < 10; i++)
    {
        // 创建树节点
        Tree *node = creatTreeNode(i+1);
        // 将树节点插入到二叉树中
        insertNode(node);
    }
    // 前序遍历二插树
    printfTree(tree);
    return 0;
}
​

运行结果:

image.png