初识二叉树( 二)

news/2024/11/3 3:10:07 标签: 算法, c语言, 数据结构

初识二叉树 二

  • 实现链式结构二叉树
    • 前中后序遍历
      • 遍历规则
      • 代码实现
    • 结点个数以及高度等
    • 层序遍历
    • 判断是否为完全二叉树

实现链式结构二叉树

⽤链表来表示⼀棵二叉树,即用链来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩⼦和右孩⼦所在的链结点的存储地址,其结构如下:

typedef int BTDataType;
// ⼆叉链
typedef struct BinaryTreeNode
{
 struct BinTreeNode* left; // 指向当前结点左孩⼦ 
 struct BinTreeNode* right; // 指向当前结点右孩⼦ 
 BTDataType val; // 当前结点值域 
}BTNode;

前中后序遍历

前中后序遍历,均用到函数的递归,因此代码量虽小,却能够帮助我们充分理解递归的思想。

遍历规则

按照规则,⼆叉树的遍历有:前序/中序/后序的递归结构遍历:
1)前序遍历(Preorder Traversal 亦称先序遍历):访问根结点的操作发⽣在遍历其左右子树之前
访问顺序为:根结点、左子树、右子树
2)中序遍历(Inorder Traversal):访问根结点的操作发⽣在遍历其左右子树之中(间)
访问顺序为:左子树、根结点、右子树
3)后序遍历(Postorder Traversal):访问根结点的操作发⽣在遍历其左右子树之后
访问顺序为:左⼦树、右⼦树、根结点

代码实现

void PreOrder(BTNode* root)
{
 if (root == NULL)
 {
 printf("N ");
 return;
 }
 printf("%d ", root->val);
 PreOrder(root->left);
 PreOrder(root->right);
}
void InOrder(BTNode* root)
{
 if (root == NULL)
 {
 printf("N ");
 return;
 }
 InOrder(root->left);
 printf("%d ", root->val);
 InOrder(root->right);
}
void PostOrder(BTNode* root)
{
 if (root == NULL)
 {
 printf("N ");
 return;
 }
 InOrder(root->left);
 InOrder(root->right);
 printf("%d ", root->val);
}

结点个数以及高度等

// ⼆叉树结点个数 
int BinaryTreeSize(BTNode* root); 
// ⼆叉树叶⼦结点个数 
int BinaryTreeLeafSize(BTNode* root); 
// ⼆叉树第k层结点个数 
int BinaryTreeLevelKSize(BTNode* root, int k); 
//⼆叉树的深度/⾼度
int BinaryTreeDepth(BTNode* root);
// ⼆叉树查找值为x的结点 
BTNode* BinaryTreeFind(BTNode* root, BTDataType x);
// ⼆叉树销毁
void BinaryTreeDestory(BTNode** root);

层序遍历

除了先序遍历、中序遍历、后序遍历外,还可以对⼆叉树进⾏层序遍历。设⼆叉树的根结点所在层数为1,层序遍历就是从所在⼆叉树的根结点出发,⾸先访问第⼀层的树根结点,然后从左到右访问第2层上的结点,接着是第三层的结点,以此类推,⾃上⽽下,⾃左⾄右逐层访问树的结点的过程就是层序遍历实现层序遍历需要额外借助数据结构:队列
在这里插入图片描述

// 层序遍历
void LevelOrder(BTNode* root)
{
 Queue q;
 QueueInit(&q);
 QueuePush(&q, root);
 while (!QueueEmpty(&q))
 {
 BTNode* top = QueueFront(&q);
 printf("%c ", top->data);
 QueuePop(&q);
 if (top->_left) 
 {
 QueuePush(&q, top->_left);
 }
 if (top->_right) 
 {
 QueuePush(&q, top->_right);
 }
 }
 QueueDesTroy(&q);
}

判断是否为完全二叉树

// 判断⼆叉树是否是完全⼆叉树
bool BinaryTreeComplete(BTNode* root) 
{
 Queue q;
 QueueInit(&q);
 QueuePush(&q, root);
 while (!QueueEmpty(&q))
 {
 BTNode* top = QueueFront(&q);
 QueuePop(&q);
 if (top == NULL) 
 {
 break;
 }
 QueuePush(&q, top->_left);
 QueuePush(&q, top->_right);
 }
 while (!QueueEmpty(&q))
 {
 BTNode* top = QueueFront(&q);
  QueuePop(&q);
 if (top != NULL) 
 {
 QueueDesTroy(&q);
 return false;
 }
 }
 QueueDesTroy(&q);
 return true;
}
```利用了队列的方法,将二叉树进行遍历,一旦在NULL后找到非空元素,说明该二叉树非完全二叉树,若全不为空,或剩下的全为空时,说明为完全二叉树,但有一点需要判断该队列是否为空。

http://www.niftyadmin.cn/n/5735923.html

相关文章

大型语言模型(LLM)的小型化研究进展

2024年,大型语言模型(LLM)的小型化研究取得了显著进展,主要采用以下几种方法实现: 模型融合:通过将多个模型或检查点合并为一个单一模型,减少资源消耗并提升整体性能。例如,《WARM: …

基于springboot的社区团购系统设计与实现

一、项目背景 网络交易(Electronic Commerce):是指实现整个贸易过程中各阶段的贸易活动的电子化。网络交易是一种多技术的集合体。其业务可包括:信息交换、售后服务、销售、电子支付、运输、组建虚拟企业、公司和贸易伙伴可以共同…

软考:大数据架构设计

大数据总结 大数据处理系统的特征 1、鲁棒性和容错性 2、低延迟读取和更新能力 3、横向扩容 4、通用性 5、延展性 6、即席查询能力 7、最少维护能力 8、可调试性 Lambda架构 批处理层 存储数据集和生成Batch View 管理主数据集,原始的,不可变的&…

C++教程(004):程序流程结构之选择结构

4 程序流程结构 C/C++支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构。 顺序结构:程序按顺序执行,不发生跳转。选择结构:程序依据条件是否满足,有选择地执行相应功能。循环结构:程序依据条件是否满足,循环多次执行某段代码。4.1 选择结构 4.1.1 if语句 …

matlab图像处理(1)

注意: 读取图像文件时需若图像不在工程目录文件下,需在代码中表明其其他路径的具体位置及名称

Spring Boot与gRPC的整合

一、gRPC的介绍 在gRPC中,客户机应用程序可以直接调用不同机器上的服务器应用程序上的方法,就像它是本地对象一样,使您更容易创建分布式应用程序和服务。与许多RPC系统一样,gRPC基于定义服务的思想,指定可以远程调用的…

因为Flock,Flutter又凉一次

哈喽,我是老刘 本来不想写这篇文章的,因为有人已经讲过了,但是问的人有点多,就还是写一下吧。 我使用Flutter开发App已经6年多了,刚开始的时候Flutter流行度还不高,很多人还不知道,也不会经常…

Learn QOpenGL 读取obj模型

/* ** File name: OpenGLModelWidget.h ** Author: ** Date: 2024-10-31 ** Brief: 读取模型文件并渲染的OpenGL控件 ** Copyright (C) 1392019713@qq.com All rights reserved. */#ifndef OpenGLModelWidget_H #define OpenGLModelWidget_H#includ…