《数据结构:链表递归实现二叉树》

文章目录

    • 一、链式结构二叉树
    • 二、链式二叉树的遍历
        • 1、遍历方式
        • 2、前序遍历
        • 3、中序遍历
        • 4、后序遍历
    • 三、链式二叉树结点个数和高度等
        • 1、二叉树结点的个数
        • 2、二叉树叶子结点的个数
        • 3、第K层结点的个数
        • 4、树的深度
        • 5、找值所在的结点
        • 6、二叉树销毁
    • 四、借助队列完成二叉树的操作
        • 1、队列创建和队列的相关操作
        • 2、借助队列完成二叉树的层序打印
        • 3、借助队列判断是否为完全二叉树

一、链式结构二叉树

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

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

⼆叉树分为空树和⾮空⼆叉树,⾮空⼆叉树由根结点、根结点的左⼦树、根结点的右⼦树组成的

在这里插入图片描述

根结点的左⼦树和右⼦树分别⼜是由⼦树结点、⼦树结点的左⼦树、⼦树结点的右⼦树组成的,因此⼆叉树定义是递归式的,后序链式⼆叉树的操作中基本都是按照该概念实现的。

二、链式二叉树的遍历

1、遍历方式

(1)前序遍历:先打印根节点,然后打印左子树,最后打印右子树
(2)中序遍历:先打印左子树,再打印根结点,最后打印右子树
(3)后序遍历:先打印左子树,再打印右子树,最后打印根结点

2、前序遍历
//前序遍历
void PreOrder(BTNode* root)
{if (root == NULL){return;}printf("%d ", root->val);PreOrder(root->left);PreOrder(root->right);
}
3、中序遍历
//中序遍历
void InOrder(BTNode* root)
{if (root == NULL){return;}InOrder(root->left);printf("%d ", root->val);InOrder(root->right);
}
4、后序遍历
//后序遍历
void PostOrder(BTNode* root)
{if (root == NULL){return;}PostOrder(root->left);PostOrder(root->right);printf("%d ", root->val);
}

三、链式二叉树结点个数和高度等

1、二叉树结点的个数
//结点个数
int BinarySize(BTNode* root)
{if (root == NULL){return 0;}return 1 + BinarySize(root->left) + BinarySize(root->right);
}
2、二叉树叶子结点的个数
//叶子结点的个数
int BinaryTreeLeafSize(BTNode* root)
{if (root == NULL){return 0;}if (root->left == NULL && root->right == NULL){return 1;}return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
}
3、第K层结点的个数
//第K层结点的个数
int BinaryTreeLevelKSize(BTNode* root, int k)
{if (root == NULL){return 0;}if (k == 1){return 1;}return BinaryTreeLevelKSize(root->left, k - 1) + BinaryTreeLevelKSize(root->right, k - 1);
}
4、树的深度
//树的深度
int BinaryTreeDepth(BTNode* root)
{if (root == NULL){return 0;}int left = 1 + BinaryTreeDepth(root->left);int right = 1 + BinaryTreeDepth(root->right);return left > right ? left : right;
}
5、找值所在的结点
//二叉树找值为x的结点
BTNode* BinaryTreeFind(BTNode* root, BTDateType x)
{if (root == NULL){return NULL;}if (root->date == x){return root;}BTNode* leftFind = BinaryTreeFind(root->left, x);return (leftFind != NULL ? leftFind : BinaryTreeFind(root->right,x));
}
6、二叉树销毁
//销毁
void BinaryTreeDesTroy(BTNode** root)
{if (*root == NULL){return;}BinaryTreeDesTroy(&((*root)->left));BinaryTreeDesTroy(&((*root)->right));free(*root);*root = NULL;}

四、借助队列完成二叉树的操作

1、队列创建和队列的相关操作
typedef  BTNode* QNDateType;
//队列结点
typedef struct QueueNode
{QNDateType* date;struct QueueNode* next;
}QN;//队列
typedef struct Queue
{QN* phead;QN* ptail;int size;
}Queue;//队列的初始化
void QueueInit(Queue* pq)
{assert(pq != NULL);pq->phead = pq->ptail = NULL;pq->size = 0;
}//入队列从队尾入
void QueuePush(Queue* pq,QNDateType x)
{assert(pq != NULL);QN* newnode = (QN*)malloc(sizeof(QN));if (newnode == NULL){perror("malloc fail");exit(1);}newnode->date = x;newnode->next = NULL;if (pq->phead == NULL){pq->phead = pq->ptail = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}//队列是否为空
bool QueueEmpty(Queue* pq)
{return pq->size == 0;
}//出队列从队头出
void QueuePop(Queue* pq)
{assert(pq != NULL);assert(!QueueEmpty(pq));if (pq->size > 1){QN* del = pq->phead;pq->phead = pq->phead->next;free(del);del = NULL;}else{free(pq->phead);pq->phead = pq->ptail = NULL;}pq->size--;
}//取队头元素
QNDateType QueueFront(Queue* pq)
{assert(pq != NULL);assert(!QueueEmpty(pq));return pq->phead->date;
}//销毁队列
void QueueDesTroy(Queue* pq)
{assert(pq);QN* pcur = pq->phead;while (pcur){QN* next = pcur->next;free(pcur);pcur = next;}pcur = NULL;pq->phead = pq->ptail = NULL;pq->size = 0;
}
2、借助队列完成二叉树的层序打印
//层序遍历
void BinaryTreeLevelOrder(BTNode* root)
{if (root == NULL){return;}Queue q;QueueInit(&q);QNDateType n = root;QueuePush(&q, root);while (!QueueEmpty(&q)){n = QueueFront(&q);printf("%d ", n->date);QueuePop(&q);if(n->left)QueuePush(&q, n->left);if(n->right)QueuePush(&q, n->right);}QueueDesTroy(&q);
}
3、借助队列判断是否为完全二叉树
//是否是完全二叉树
bool BinaryTreeComplete(BTNode* root)
{if (root == NULL){return false;}Queue q;QNDateType n = root;QueueInit(&q);QueuePush(&q, root);while (n){n = QueueFront(&q);QueuePop(&q);if(n)QueuePush(&q, n->left);if(n)QueuePush(&q, n->right);}while (!QueueEmpty(&q)){n = QueueFront(&q);QueuePop(&q);if (n != NULL){QueueDesTroy(&q);return false;}}QueueDesTroy(&q);return true;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3269888.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

react.16+

1、函数式组件 在vite脚手架中执行&#xff1a; app.jsx: import { useState } from react import reactLogo from ./assets/react.svg import viteLogo from /vite.svg import ./App.cssfunction App() {console.log(this)return <h2>我是函数式组件</h2> }exp…

leetcode-104. 二叉树的最大深度

题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;root [1,n…

全能数据分析工具:Tableau Desktop 2019 for Mac 中文激活版

Tableau Desktop 2019 一款专业的全能数据分析工具&#xff0c;可以让用户将海量数据导入并记性汇总&#xff0c;并且支持多种数据类型&#xff0c;比如像是编程常用的键值对、哈希MAP、JSON类型数据等&#xff0c;因此用户可以将很多常用数据库文件直接导入Tableau Desktop&am…

字符串的引入和注意事项

首先&#xff0c;他和整型一样————int data[ ]{1,2,3,4,5}; 和整型数组一个道理————char str[ ]{h,a,l,l,o}; 还可以直接表达成这样————char str[ ]"hallo";字符串变量&#xff0c;可以被修改 或者用另一种方式————char *p"hallo";字符…

C# 使用pythonnet 迁入 python 初始化错误解决办法

pythonnet 从 3.0 版本开始&#xff0c;必须设置Runtime.PythonDLL属性或环境变量 例如&#xff1a; string pathToVirtualEnv ".\\envs\\pythonnetTest"; Runtime.PythonDLL Path.Combine(pathToVirtualEnv, "python39.dll"); PythonEngine.PythonHom…

.Net 检验信息采集及管理系统LIS,成熟的医院实验室管理系统源码

检验管理系统LIS实现了检验信息电子化、检验信息管理自动化&#xff0c;具备与医嘱双向沟通、采用条码管理手段、财务自动计费、仪器双向控制等重要功能特点。其工作流程为通过门诊医生和住院工作站提出检验申请&#xff0c;生成相应患者的化验条码标签&#xff0c;在生成化验单…

计算机专业MEM工程管理硕士课程介绍

计算机专业MEM&#xff08;工程管理硕士&#xff09;的主要学习内容涵盖了工程技术、管理学和经济学等多个领域&#xff0c;特别是结合了计算机专业的特点&#xff0c;注重在项目管理、工程管理、信息系统管理等方面的培养。以下是对计算机专业MEM工程管理硕士主要学习课程的详…

leetcode105. 从前序与中序遍历序列构造二叉树,步骤详解附代码

leetcode105. 从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder…

ubuntu22.04单个网口两个IP

其中 4网段IP可用来上网&#xff0c;3 网段用来内网 界面显示: 配置文件&#xff1a; 01-network-manager-all.yaml 放在 /etc/netplan/ # Let NetworkManager manage all devices on this systemnetwork:version: 2renderer: networkdethernets:eth0:dhcp4: falsedhcp6: …

大学生暑期三下乡社会实践通讯稿怎样投稿?

在这个充满挑战与机遇的暑期,我有幸成为学院暑期三下乡社会实践活动的一员,并肩负起志愿服务团队向媒体投稿宣传报道的重任。起初,面对这项任务,我满怀激情与期待,以为只需凭借一腔热血和手中的笔,就能将实践的点点滴滴生动呈现给世人。然而,现实却给我上了一堂生动的课。 之初…

使用vscode连接开发机进行python debug

什么是debug&#xff1f; 当你刚开始学习Python编程时&#xff0c;可能会遇到代码不按预期运行的情况。这时&#xff0c;你就需要用到“debug”了。简单来说&#xff0c;“debug”就是能再程序中设置中断点并支持一行一行地运行代码&#xff0c;观测程序中变量的变化&#xff…

在线心里咨询系统的设计与实现2024(代码+论文+开题报告+ppt)

下载在最后 技术栈: vuemysqlspringboot 展示: 下载地址: https://download.csdn.net/download/hhtt19820919/89583101 备注: 运行有问题请私信我,私信按钮在文章左边)

鱼哥好书分享活动第28期:看完这篇《终端安全运营》终端安全企业基石,为你的终端安全保驾护航!

鱼哥好书分享活动第28期&#xff1a;看完这篇《终端安全运营》终端安全企业基石&#xff0c;为你的终端安全保驾护航&#xff01; 读者对象&#xff1a;主要内容&#xff1a;本书目录&#xff1a;了解更多&#xff1a;赠书抽奖规则: 在当前网络威胁日益复杂化的背景下&#xff…

nginx转发netty长链接(nginx负载tcp长链接配置)

首先要清楚一点&#xff0c;netty是长链接是tcp连接不同于http中负载在http中配置server监听。长连接需要开启nginx的stream模块(和http是并列关系) 安装nginx时注意开启stream&#xff0c;编译时加上参数 --with-stream &#xff08;其他参数根据自己所需来加&#xff09; …

基于Pytorch框架的深度学习densenet121神经网络鸟类行为识别分类系统源码

第一步&#xff1a;准备数据 5种鸟类行为数据&#xff1a;self.class_indict ["bowing_status", "grooming", "headdown", "vigilance_status", "walking"] &#xff0c;总共有23790张图片&#xff0c;每个文件夹单独放一…

Github个人网站搭建详细教程【Github+Jekyll模板】

文章目录 前言一、介绍1 Github Pages是什么2 静态网站生成工具3 Jekyll简介Jekyll 和 GitHub 的关系 4 Mac系统Jekyll的安装及使用安装Jekyll的简单使用 二、快速搭建第一个Github Pages网站三、静态网站模板——Chirpy1 个人定制 四、WordPress迁移到Github参考资料 前言 23…

Opencv学习项目4——手部跟踪

上一篇博客我们介绍了mediapipe库和对手部进行了检测&#xff0c;这次我们进行手部关键点的连线 代码实现 import cv2 import mediapipe as mpcap cv2.VideoCapture(1) mpHands mp.solutions.hands hands mpHands.Hands() mpDraw mp.solutions.drawing_utilswhile True:…

IDEA-安装插件 驼峰下划线转换

第一步&#xff1a;安装 file-settings-plugins-在marketplace搜索“CamelCase”-点击安装 第二步&#xff1a;设置 file-settings-editor-camel_case 第三步&#xff1a;使用 选中想转换的遍历 使用快捷键 Alt Shift U

Windows环境下安装docker、配置Ubuntu容器并使用vscode ssh连接到容器

目录 一、Windows环境下安装docker二、配置Ubuntu三、在容器中安装ssh服务参考文章 一、Windows环境下安装docker 在任务栏中搜索**“Windows功能”** -将适用于Linux的Windows子系统和虚拟机平台选上 然后按照提示重启电脑。然后开始安装WSL。通过cmd以管理员身份打开命令提…

知识图谱 networkx、pyvis页面简单可视化

参考&#xff1a; https://huggingface.co/learn/cookbook/en/information_extraction_haystack_nuextract networkx 构建保存节点和边&#xff0c;pyvis保存为html 注意点 1、pyvis vscode的jupyer不支持&#xff0c;会显示不正常&#xff0c;直接还是本地jupyter环境使用 2…