C语言数据结构(14)--二叉树的链式存储结构

简介: 本文目录1. 模型构建2. 节点结构体定义3. 二叉树的构造与遍历

1. 模型构建

二叉树如下图,是由节点、节点与节点之前的连接组成的,而且连接是有顺序的,一般我们认为左边的次序要优先于右边。

image.png

对于每个节点来说,都有一个数据区域存放该节点的信息,另外还需要描述其左右子节点。每个节点的这三个信息确认之后,其实整个树的信息就确认了。


2. 节点结构体定义

typedef struct {

int data;//数据区域

struct BinaryTreeNode* left;//左子节点

struct BinaryTreeNode* right;//右子节点

}BinaryTreeNode;

1

2

3

4

5

非常完美吭,不再解释了。


3. 二叉树的构造与遍历

非常简单啊,从根节点开始逐次构造即可,看代码

#include<stdio.h>
/*
* 使用链表构造与遍历二叉树
* 作者:熊猫大大
* 时间:2019-12-01
*/
#include <stdio.h>
typedef struct {
  int data;//数据区域
  struct BinaryTreeNode* left;//左子节点
  struct BinaryTreeNode* right;//右子节点
}BinaryTreeNode;
//为树的当前节点添加左子节点
int addLeftChild(BinaryTreeNode* curNode, int leftData)
{
  //分配新节点
  BinaryTreeNode* leftNode = (BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
  //为新节点挂载数据
  leftNode->data = leftData;
  //新节点暂时无子节点
  leftNode->left = NULL;
  leftNode->right = NULL;
  //将新节点挂到当前节点下
  curNode->left = leftNode;
  return 1;
}
//为树的当前节点添加右子节点
int addRightChild(BinaryTreeNode* curNode,int rightData)
{
  //分配新节点
  BinaryTreeNode* rightNode = (BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
  //为新节点挂载数据
  rightNode->data = rightData;
  //新节点暂时无子节点
  rightNode->left = NULL;
  rightNode->right = NULL;
  //将新节点挂到当前节点下
  curNode->right = rightNode;
  return 1;
}
//遍历当前节点与子节点
void printTree(BinaryTreeNode *node)
{
  if (node == NULL) {
    return;
  }
  printf("父节点:%d", node->data);
  printf("----");
  BinaryTreeNode* temp = NULL;
  if (node->left != NULL) 
  {
    temp = node->left;
    printf("左:%d", temp->data);
  }
  if (node->right != NULL)
  {
    temp = node->right;
    printf("右:%d", temp->data);
  }
  printf("\n");
  printTree(node->left);
  printTree(node->right);
}
//----------------------------------------------------------------------------------------------------测试入口区域
int main()
{
  //设定根节点
  BinaryTreeNode root;
  //根节点
  root.data = 1;
  root.left = NULL;
  root.right = NULL;
  addLeftChild(&root, 2);
  addRightChild(&root, 3);
  //为2号节点增加子节点
  addLeftChild(root.left, 4);
  addRightChild(root.left, 5);
  printTree(&root);
  return 1;
}

image.png


相关文章
|
2天前
|
存储 机器学习/深度学习
【数据结构】二叉树全攻略,从实现到应用详解
本文介绍了树形结构及其重要类型——二叉树。树由若干节点组成,具有层次关系。二叉树每个节点最多有两个子树,分为左子树和右子树。文中详细描述了二叉树的不同类型,如完全二叉树、满二叉树、平衡二叉树及搜索二叉树,并阐述了二叉树的基本性质与存储方式。此外,还介绍了二叉树的实现方法,包括节点定义、遍历方式(前序、中序、后序、层序遍历),并提供了多个示例代码,帮助理解二叉树的基本操作。
32 13
【数据结构】二叉树全攻略,从实现到应用详解
|
1天前
|
存储 编译器 程序员
C语言程序的基本结构
C语言程序的基本结构包括:1)预处理指令,如 `#include` 和 `#define`;2)主函数 `main()`,程序从这里开始执行;3)函数声明与定义,执行特定任务的代码块;4)变量声明与初始化,用于存储数据;5)语句和表达式,构成程序基本执行单位;6)注释,解释代码功能。示例代码展示了这些组成部分的应用。
|
20天前
|
算法
【初阶数据结构篇】二叉树算法题
二叉树是否对称,即左右子树是否对称.
|
20天前
|
存储
【初阶数据结构篇】实现链式结构二叉树(二叉链)下篇
要改变root指针的指向,将本来指向根节点的root指针改为空,所以传二级指针(一级指针也可以,只不过在调用完记得把root置为空)。
|
20天前
|
存储 测试技术
【初阶数据结构篇】实现链式结构二叉树(二叉链)上篇
先构建根结点,再对左右子树构建,每次需要时申请一个结点空间即可,否则返回空指针。
|
20天前
|
存储 算法 测试技术
【初阶数据结构篇】实现顺序结构二叉树(堆的实现方法)
注意传过去的参数是插入的位置,即插入前的size,在调整完后再将size++
|
4天前
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
4天前
|
C语言
C语言 字符串操作函数
本文档详细介绍了多个常用的字符串操作函数,包括 `strlen`、`strcpy`、`strncpy`、`strcat`、`strncat`、`strcmp`、`strncpy`、`sprintf`、`itoa`、`strchr`、`strspn`、`strcspn`、`strstr` 和 `strtok`。每个函数均提供了语法说明、参数解释、返回值描述及示例代码。此外,还给出了部分函数的自实现版本,帮助读者深入理解其工作原理。通过这些函数,可以轻松地进行字符串长度计算、复制、连接、比较等操作。
|
5天前
|
SQL 关系型数据库 C语言
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)