【数据结构与算法】二叉树(Binary Tree)

相关推荐:堆(Heap) / 堆排序(HeapSort) / TopK

文章目录

  • 1.树
    • 1.1 树相关概念
    • 1.2 举例树的应用
  • 2. 二叉树
    • 2.1 二叉树分类
    • 2.2 特殊的二叉树
    • 2.3 二叉树的存储结构
  • 3. 二叉树实现与热门问题

1.树

树是一种非线性的数据结构,它看起来像一棵倒挂的树,根朝上而叶子朝下。下图是一棵二叉树,每个节点最多只有两个孩子节点。
在这里插入图片描述

1.1 树相关概念

在这里插入图片描述

  1. 根节点:如上图A节点就是根节点。
  2. 节点的度:一个节点含有的子树的个数,如上图A节点的度为6,F节点的度为3。
  3. 叶节点:度为0的节点,如上图B、C、H、I…等节点为叶节点。
  4. 父节点:也叫双亲节点,如上图E是I和J的父节点,其它节点同理。
  5. 子节点:也叫孩子节点,如上图B、C、D、E等是A的孩子节点。
  6. 兄弟节点:具有相同父节点的节点,如上图P、Q是兄弟节点。
  7. 树的度:最大的节点的度称为树的度,如上图树的度为6。
  8. 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推。
  9. 树的高度或深度:树中节点的最大层次,如上图树的高度为4。
  10. 森林:由m(m>0)棵互不相交的树的集合称为森林。
    在这里插入图片描述

1.2 举例树的应用

Linux的文件系统:
在这里插入图片描述
Windows的文件系统也是多叉树,和Linux文件系统不同的是Windows的文件系统可以是森林(至少分了两个盘)。
在这里插入图片描述

2. 二叉树

2.1 二叉树分类

普通的二叉树是没有意义的,存储数据并不比链表或数组好,真正让二叉树有意义的是二叉搜索树(又称二叉排序树或二叉查找树)、AVL树(平衡二叉树)、B树和红黑树。

二叉搜索树:简单地说就是左孩子节点比父节点小、右孩子节点比父节点大的树,二叉树的好处是遍历很快,从名字也能得出它是干嘛的。
在这里插入图片描述
不过极端的二叉搜索树则会造成很多浪费,不仅树另一边节点存储无效的NULL值,最要命的是遍历的时间复杂度增高。
在这里插入图片描述
平衡二叉树二叉树可以解决二叉搜索树的缺点,是其升级版,另外还有B树、红黑树等,感兴趣的小伙伴自行了解或看我其它相关文章,否则本篇文章会占用大量篇幅。

2.2 特殊的二叉树

  1. 满二叉树:每层的节点都是满的。
  2. 完全二叉树:假设树的高度是h,前h-1层的节点都是满的,最后一层也就是h层的节点不一定满,但一定要是有序。满二叉树也是一种特殊的完全二叉树,另外 (heap)也是完全二叉树,想了解的可以看这篇文章:堆(Heap)。
    在这里插入图片描述

2.3 二叉树的存储结构

二叉树可以使用两种结构存储:顺序结构或链式结构,说白了就是数组或链表。

不过对于二叉树而言基本都是用链表存储,因为用数组存储二叉树会浪费很多空间,而极端的二叉树搜索树更甚。
在这里插入图片描述
只有完全二叉树/完全二叉树/堆才适合用数组存储,其特性就决定了不会浪费数组空间,为什么非完全二叉树用数组存储会浪费内存空间,而完全二叉树不会,具体了解请看 文章:堆(Heap)。

C语言表示二叉树的结构:

typedef int valtype;
typedef struct TreeNode {valtype val;struct TreeNode* left;struct TreeNode* right;
} TreeNode;

3. 二叉树实现与热门问题

由于普通的二叉树插入删除操作都是没有意义的,所以这里不实现这种操作;另外由于二叉树通常使用链式存储,所以很多操作都是通过递归实现

申明:

#pragma once#include <stdio.h>
#include <stdlib.h>typedef int valtype;
typedef struct TreeNode {valtype val;struct TreeNode* left;struct TreeNode* right;
} TreeNode;TreeNode* NewNode(valtype val);// 前、中、后序遍历
void PreOrder(TreeNode* root);
void InOrder(TreeNode* root);
void PostOrder(TreeNode* root);// 树节点个数
size_t TreeSize(TreeNode* root);
// 叶子节点个数
size_t TreeLeafSize(TreeNode* root);
// 树高度/深度
size_t TreeHeight(TreeNode* root);
// 第k层节点个数
size_t TreeKthSize(TreeNode* root, int k);

实现:

#define _CRT_SECURE_NO_WARNINGS 1#include "BinaryTree.h"TreeNode* NewNode(valtype val) {TreeNode* treeNode = (TreeNode*)malloc(sizeof(TreeNode));if (treeNode == NULL) {perror("BuyNode malloc failed.\n");exit(-1);}treeNode->val = val;treeNode->left = NULL;treeNode->right = NULL;return treeNode;
}void PreOrder(TreeNode* root) {if (root != NULL) {printf("%d ", root->val);PreOrder(root->left);PreOrder(root->right);}
}void InOrder(TreeNode* root) {if (root != NULL) {InOrder(root->left);printf("%d ", root->val);InOrder(root->right);}
}void PostOrder(TreeNode* root) {if (root != NULL) {PostOrder(root->left);PostOrder(root->right);printf("%d ", root->val);}
}size_t TreeSize(TreeNode* root) {return root == NULL // 本身 + 左子树 + 右子树节点之和? 0 : 1 + TreeSize(root->left) + TreeSize(root->right);
}size_t TreeLeafSize(TreeNode* root) {if (root == NULL) {return 0;}// 非叶子结点的左子树和右子树的叶子节点之和return root->left == NULL && root->right == NULL? 1 : TreeLeafSize(root->left) + TreeLeafSize(root->right);
}size_t TreeHeight(TreeNode* root) {if (root == NULL) {return 0;}// 选出左子树和右子树中较高的树 + 根节点本身高度return max(TreeHeight(root->left), TreeHeight(root->right)) + 1;//size_t left = TreeHeight(root->left);//size_t right = TreeHeight(root->right);//return (left > right ? left : right) + 1; 
}size_t TreeKthSize(TreeNode* root, int k) {if (root == NULL || k < 1) {return 0;}else if (k == 1) { return 1; // 第k层}else { // k > 1 向下走直到来到第k层return TreeKthSize(root->left, k-1) + TreeKthSize(root->right, k-1);}
}

测试:

#define _CRT_SECURE_NO_WARNINGS 1#include "BinaryTree.h"static void BuildTree(TreeNode* root);int main() {TreeNode root; BuildTree(&root);PreOrder(&root);printf("\n");InOrder(&root);printf("\n");PostOrder(&root);printf("\n");printf("TreeSize = %zd\n", TreeSize(&root));printf("TreeLeafSize = %zd\n", TreeLeafSize(&root));printf("TreeHeight = %zd\n", TreeHeight(&root));printf("TreeKthSize = %zd\n", TreeKthSize(&root, 3));return 0;
}static void BuildTree(TreeNode* root) {TreeNode* node2 = NewNode(2);TreeNode* node3 = NewNode(3);TreeNode* node4 = NewNode(4);TreeNode* node5 = NewNode(5);TreeNode* node6 = NewNode(6);TreeNode* node7 = NewNode(7);root->val = 1;root->left = node2;root->right = node4;node2->left = node3;node2->right = node7;node4->left = node5;node4->right = node6;
}

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

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

相关文章

金融行业专题|证券超融合架构转型与场景探索合集(2023版)

更新内容 更新 SmartX 超融合在证券行业的覆盖范围、部署规模与应用场景。新增操作系统信创转型、Nutanix 国产化替代、网络与安全等场景实践。更多超融合金融核心生产业务场景实践&#xff0c;欢迎阅读文末电子书。 在金融行业如火如荼的数字化转型大潮中&#xff0c;传统架…

小知识:UAC 对话框的颜色所代表的含义

如果 Windows Vista 启用了用户账户控制(UAC, User Account Control)之后&#xff0c;如果你对一个可执行程序右键&#xff0c;并以管理员身份运行&#xff0c;则会弹出一个权限提升对话框&#xff0c;上面会显示一段警告信息并带有不同的颜色。 下面我们来看看各种不同的颜色…

ownips的自救指南:一次账号封停事件的心路历程与解决策略

前言 小明以前是全球500强电商类公司的运营工作人员&#xff0c;在事业的上升期日入斗金、年薪百万&#xff0c;后面分钱时被产品、总监、老板瓜分了大头&#xff0c;大气都大敢出。由于小明掌握了核心技术&#xff0c;从联系品牌供应商、电商选品、用户行为调研、用户画像收集…

如何在Windows系统上部署docker

上次在Windows系统上部署成功Ubuntu系统&#xff0c;这次准备在Windows上部署docker desktop应用 这个应用软件类似于虚拟机&#xff0c;可以在该应用软件上部署多个镜像容器。其最直观的表现就是可以借用Windows和Ubuntu终端来访问docker“模拟的系统”。 Docker简介 Docke…

《合成孔径雷达成像算法与实现》Figure6.8

clc clear close all参数设置 距离向参数设置 R_eta_c 20e3; % 景中心斜距 Tr 2.5e-6; % 发射脉冲时宽 Kr 20e12; % 距离向调频率 alpha_os_r 1.2; % 距离过采样率 Nrg 320; % 距离线采样数 距离向…

Flink流式数据倾斜

1. 流式数据倾斜 流式处理的数据倾斜和 Spark 的离线或者微批处理都是某一个 SubTask 数据过多这种数据不均匀导致的&#xff0c;但是因为流式处理的特性其中又有些许不同 2. 如何解决 2.1 窗口有界流倾斜 窗口操作类似Spark的微批处理&#xff0c;直接两阶段聚合的方式来解决…

Maven之安装自定义jar到本地Maven仓库中

Maven之安装自定义jar到本地Maven仓库中 文章目录 Maven之安装自定义jar到本地Maven仓库中1. 命令行窗口安装方式1. 常用参数说明2. 安装实例 2. IDEA中安装方式3. 使用 1. 命令行窗口安装方式 安装指定文件到本地仓库命令&#xff1a;mvn install:install-file; 在windows的cm…

DAC调节DCDC输出电压的电路方案分析

BUCK型电源芯片的调压方式分析 1、前题 BUCK型的电源芯片非常多&#xff0c;常用的如LM2576、LM2596等等&#xff0c;这种芯片优点很多&#xff0c;比如功率大、体积小、效率高等。这种芯片一般都可以通过电阻分压的方式设定反馈脚VFB的电压来改变电源芯片的输出电压。但最近…

Java+微信小程序实现智慧家政系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询家政服务4.2 新增单条服务订单4.3 新增留言反馈4.4 小程序登录4.5 小程序数据展示 五、免责说明 一、摘要 1.1 项目介绍 基于微信小程序JAVAVueSpringBootMySQL的智慧家政系统&#xff0…

代码随想录算法训练营29期|day43 任务以及具体任务

第九章 动态规划 part05 1049. 最后一块石头的重量 II class Solution {public int lastStoneWeightII(int[] stones) {int sum 0;for (int i : stones) {sum i;}int target sum >> 1;//初始化dp数组int[] dp new int[target 1];for (int i 0; i < stones.lengt…

stm32Cubmax PWM实验

一、基本概念 PWM&#xff08;脉冲宽度调制&#xff09;是一种常用于控制电子设备的技术。它通过改变电信号的脉冲宽度来控制设备的输出功率或电流。在PWM中&#xff0c;所谓的脉冲宽度是指一个周期内脉冲的持续时间。周期是指脉冲重复的时间间隔。 在PWM中&#xff0c;一个周…

空想--让MYSQL安装双引擎SQL优化器

坑人的innodb_thread_concurrencyMYSQL的优化器是硬解析, 应用每次发往MYSQL的SQL是文本格式,需要编译,虽然时间不多,也就几百毫秒的事情,可架不住SQL的请求并发量啊! 为此数据库走了两条路线, 一条是ORACLE的缓存路线, 另外一条就是MYSQL的快速路线. ORACLE是尽可能的深度…

C语言——最大公因数和最小公倍数

在计算机科学中&#xff0c;求解两个或多个数的最大公因数&#xff08;Greatest Common Divisor&#xff0c;简称GCD&#xff09;和最小公倍数&#xff08;Least Common Multiple&#xff0c;简称LCM&#xff09;是数学计算中的基本问题。C语言作为一种广泛应用于科学计算和工程…

【Linux】文件的软硬链接

文章目录 一、文件和目录的一些命令ls 命令stat 命令 二、链接的概念三、软链接&#xff08;symbolic link&#xff09;创建和删除软链接的示例软链接的特性软链接的应用使用 find 查找链接文件 四、硬链接&#xff08;hard link&#xff09;创建和删除硬链接的示例硬链接的特性…

层层深入揭示C语言指针的底层机制

理解C语言指针的底层机制需要我们从硬件、操作系统和编译器三个层次逐步展开。 1. 硬件层次 计算机硬件是实现内存管理的基础。内存是一个由无数个存储单元组成的线性空间&#xff0c;每个存储单元都有一个唯一的地址。这个地址通常是一个二进制数&#xff0c;表示该存储单元…

飞马座卫星

1960年代马歇尔太空飞行中心的历史显然与建造土星五号月球火箭有关。然而&#xff0c;鲜为人知的是该中心在设计科学有效载荷方面的早期工作。 Fairchild 技术人员正在检查扩展的 Pegasus 流星体探测表面。Pegasus 由马里兰州黑格斯敦的 Fairchild Stratos Corporation 通过马歇…

【芯片设计- RTL 数字逻辑设计入门 11.1 -- 状态机实现 移位运算与乘法 1】

文章目录 移位运算与乘法状态机简介SystemVerilog中的测试平台VCS 波形仿真 阻塞赋值和非阻塞赋值有限状态机&#xff08;FSM&#xff09;与无限状态机的区别 本篇文章接着上篇文章【芯片设计- RTL 数字逻辑设计入门 11 – 移位运算与乘法】 继续介绍&#xff0c;这里使用状态机…

电子电器架构 —— 网关测试脚本分析

电子电器架构 —— 网关测试 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何 消耗你的人和事,多看一眼都是你的不对。非…

27/100两数相除(位移todo)

题目 27/100两数相除 给你两个整数&#xff0c;被除数 dividend 和除数 divisor。将两数相除&#xff0c;要求 不使用 乘法、除法和取余运算。 整数除法应该向零截断&#xff0c;也就是截去&#xff08;truncate&#xff09;其小数部分。例如&#xff0c;8.345 将被截断为 8 …

5G NR 频率计算

5G中引入了频率栅格的概念&#xff0c;也就是小区中心频点和SSB的频域位置不能随意配置&#xff0c;必须满足一定规律&#xff0c;主要目的是为了UE能快速的搜索小区&#xff1b;其中三个最重要的概念是Channel raster 、synchronization raster和pointA。 1、Channel raster …