一、链表基本结构
链表是最基础的数据结构之一,它通过指针将零散的内存块串联起来,形成一个线性序列。
//单链表节点定义
struct ListNode
{
int data; //数据域
struct ListNode* next; //指针域-指向下一个节点
}
二、二叉树基本结构
二叉树是每个节点最多有两个子节点的树结构,广泛应用于搜索、排序等场景。
// 二叉树节点定义
struct TreeNode {
int data; // 数据域
struct TreeNode* left; // 左子节点指针
struct TreeNode* right; // 右子节点指针
};
三、链表构建二叉树的核心思想
将链表的“一个next指针”扩展为“两个指针”,分别指向左右子树, 二叉树节点本质上是一个带有两个next指针的链表节点。
四、用链表构建和遍历二叉树C语言代码详解
1.定义二叉树节点结构
#include <stdio.h>
#include <stdlib.h>
//定义类型
struct tree2
{
struct tree2 *left; //指针:存左子节点的内存地址
int data; //节点存储的数值
struct tree2 *right; //指针:存右子节点的内存地址
};
typedef struct tree2 treenode2; //给 struct tree2 取别名 treenode2
typedef treenode2* btree2; //给 treenode2 的指针取别名 btree2
2. 定义插入单个节点的函数
//二叉树插入节点
btree2 insert_node(btree2 root,int nodedata)
{
btree2 newnode = NULL;
btree2 currentnode = NULL;
btree2 parentnode = NULL;
// 1. 创建新节点:分配内存+初始化
newnode = (btree2)malloc(sizeof(treenode2));
newnode ->data = nodedata;
newnode ->left = NULL;
newnode ->right = NULL;
// 2. 空树处理,新节点作为根
if(root == NULL)
{
return newnode;
}
// 3. 遍历树,找父节点
currentnode = root;
parentnode = NULL;
while(currentnode!=NULL)
{
parentnode = currentnode;
if(nodedata > currentnode ->data)
{
currentnode = currentnode -> right;
}
else
{
currentnode = currentnode -> left;
}
}
// 4. 插入新数值
if(nodedata > parentnode ->data)
{
parentnode ->right = newnode;
}
else
{
parentnode ->left = newnode;
}
return root;
}
3.创建二叉树函数
//链表创建二叉树
btree2 create_tree(int *nodelist,int len)
{
btree2 root = NULL; //初始化时数是空的,根为NULL
for(int i=0;i < len;i++)
{
//把数组里的第i个元素插入树中,更新根节点
root = insert_node(root,nodelist[i]);
}
return root; //返回构建好的树的根节点
}
4.打印二叉树
前、中、后序的实现逻辑是一样的。
//打印二叉树-前序
void print_qbtree(btree2 root)
{
if(root != NULL)
{
printf("%d",root->data);
print_qbtree(root->left);
print_qbtree(root->right);
}
}
//打印二叉树-中序
void print_zbtree(btree2 root)
{
if(root != NULL)
{
print_zbtree(root->left);
printf("%d",root->data);
print_zbtree(root->right);
}
}
//打印二叉树-后序
void print_hbtree(btree2 root)
{
if(root != NULL)
{
print_hbtree(root->left);
print_hbtree(root->right);
printf("%d",root->data);
}
}
5.主函数main入口
int main()
{
int nodelist[] = {7,4,5,9,3,2};
int len = 6;
//定义btree2类型变量root,存储创建好的树
btree2 root = create_tree(nodelist,len);
//打印
printf("链表二叉树的遍历前顺序:");
int i;
for(i=0;i<len;i++)
{
printf("%d",nodelist[i]);
}
printf("\n");
printf("链表二叉树的中序遍历结果(左、根、右):");
print_zbtree(root);
printf("\n");
printf("链表二叉树的前序遍历结果(根、左、右):");
print_qbtree(root);
printf("\n");
printf("链表二叉树的后序遍历结果(左、右、根):");
print_hbtree(root);
printf("\n");
return 0;
}
流程
定义数组 —> 构建二叉树 —> 打印结果。
结果

二叉树结果展示图

2万+

被折叠的 条评论
为什么被折叠?



