二叉树代码实现
1.实现逻辑
实现思路图:
借助队列实现二叉树,按插入顺序将节点将节点加入到队列,每次插入时读取队列的首元素将子节点从左往右挂到双亲节点上。右指针挂载之后出队。
代码实现:
#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;
}
运行结果: