基础数据结构----二叉树

二叉树的概念

1.二叉树的性质:

二叉树的每个节点最多有两个子节点,分别称为左孩子、右孩子,以他们为根的子树称为左子树、右子树。

二叉树的每层节点数以 2 的倍数递增,所以二叉树的第 i 层最多有  2^{i-1} 个节点。如果每层的节点数都是满的,称它为满二叉树。一个 n 层的满二叉树,一共有 2^{n}-1 个节点。如果满二叉树只在最后一层有缺失,并且缺失的编号都在最后,则称为完全二叉树。

 2.二叉树的存储结构

二叉树的一个节点的存储,包括节点的值、左右子节点,有动态和静态两种存储方法。

(1)动态二叉树。在数据结构中一般这样定义:

struct node
{int value;//节点的值,可以定义多个值node *left,*right;//指向左右子节点
};

动态新建一个node时,用new运算符动态申请一个节点。使用完毕后,用delete释放,否则会产生内存泄漏。动态二叉树的优点是不浪费空间,缺点是需要管理,不小心会出错。

(2)用静态数组存储二叉树。在算法竞赛中,为了编码简单,加快速度,一般用静态数组实现二叉树。下面定义一个大小为 N 的结构体数组。

struct node
{//静态二叉树char value;int left,right;//可以简写成l,r
}tree[N];

如下图所示为一颗二叉树的静态存储,根是 tree[ 5 ]。编码时一般不用 tree[ 0 ],因为 0 被用来表示空节点,如叶子节点 tree[ 2 ] 没有子节点,就把它的子节点赋值为 l = r = 0。

特别地,用数组实现完全二叉树,访问非常便捷,此时连 left、right 都不需要定义。一颗节点总数量为 k 的完全二叉树,设 1 号节点为根节点,有以下性质:

        (1)编号 i > 1 的节点,其父节点编号是 i / 2;

        (2)如果 2i > k,那么节点 i 没有孩子;如果 2i + 1 > k,那么节点 i 没有右孩子;

        (3)如果节点 i 有孩子,那么它的左孩子是节点 2i,右孩子是节点 2i + 1。

3.二叉树的遍历

(1)宽度优先遍历

有时需要按层次一层层从上到下遍历二叉树。例如下图,需要按照 E-BG-ADFI-CH 的顺序访问,此时用宽度优先遍历(BFS)是最合适的。

(2)深度优先遍历

用深度优先搜索(DFS)遍历二叉树,代码较为简单,而且产生了许多应用。

按照深度搜索的顺序访问二叉树,对父节点、左孩子、右孩子进行组合,有先序遍历、中序遍历、后序遍历这 3 种访问顺序,这里默认左孩子在右孩子的前面。

       (1)先序遍历,按父节点、左孩子、右孩子的顺序访问,在上图中,先序遍历输出的结果为EBADCGFIH,先序遍历的第一个节点是根。

void preorder(node *root)
{cout << root->value;preorder(root->left);//递归左子树preorder(root->right);//递归右子树
}

        (2)中序遍历,按左孩子、父节点、右孩子的顺序访问。在上图中,中序遍历输出的顺序是ABCDEFGHI。

void inorder(node *root)
{inorder(root->left);//递归左子树cout << root->value;//输出inorder(root->right);//递归右子树
}

        (3)后序遍历,按左孩子、右孩子、父节点的顺序访问。上图中二叉树的后序遍历为ACDBFHIGE。后序遍历的最后一个节点是根节点

void postorder(node *root)
{postorder(root->left);//递归左子树postorder(root->right);//递归右子树cout << root->value;
}

如果已知某课二叉树的中序遍历和另一种遍历,就可以唯一确定一颗二叉树,即“中序+先序”或“中序+后序”,都能确定一颗树

但是,如果不知道中序遍历,只有先序遍历+后序遍历,则不能唯一确定一颗二叉树

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个不错的文章伪原创系统程序源码

一款文章伪原创系统程序源码免费分享&#xff0c;程序是站长原创的。 一共花了站长几天时间写的这个文章伪原创平台&#xff0c;程序无需数据库。 程序前端采用BootStrap框架搭建&#xff0c;后端采用PHP原生书写。 前端伪原创采用Ajax无刷新提交&#xff0c;Ajax转换到词库…

【CVE 复现】CVE-2022-0185 fsconfig之整数溢出

影响版本&#xff1a;Linux-v5.1~v5.16.2 测试版本&#xff1a;Linux-5.11.22&#xff0c;由于懒得搞环境&#xff0c;所以直接用的 bsauce 大佬提供的 测试环境 看看 patch&#xff1a; diff --git a/fs/fs_context.c b/fs/fs_context.c index b7e43a780a625b..24ce12f0db32…

打造专属小程序,乔拓云模板平台助力商家抢占先机

打造专属小程序&#xff0c;乔拓云模板平台助力商家抢占先机&#xff01;该平台涵盖全行业小程序模板&#xff0c;一键复制即可上线。 想要快速创建高效实用的小程序&#xff0c;乔拓云小程序模板开发平台为您提供了解决方案&#xff01;我们为您提供一系列精心设计的小程序模板…

零基础如何入门HarmonyOS开发?

HarmonyOS鸿蒙应用开发是当前非常热门的一个领域&#xff0c;许多人都想入门学习这个技术。但是&#xff0c;对于零基础的人来说&#xff0c;如何入门确实是一个问题。下面&#xff0c;我将从以下几个方面来介绍如何零基础入门HarmonyOS鸿蒙应用开发学习。 一、了解HarmonyOS鸿…

【ArcGIS Pro微课1000例】0053:基于SQL Server创建与启用地理数据库

之前的文章有讲述基于SQL Server创建企业级地理数据库,本文讲述在SQL Server中创建常规的关心数据库,然后在ArcGIS Pro中将其启用,转换为企业级地理数据库。 1. 在SQL Server中创建数据库** 打开SQL Server 2019,连接到数据库服务器。 展开数据库连接,在数据库上右键→新…

Windows 上安装nvm node版本管理工具 windows安装nvm 管理工具

Windows 上安装nvm node版本管理工具 windows安装nvm 管理工具 1、nvm2、安装2.1、下载 NVM 安装程序进行安装2.2、打开nvm的安装路径&#xff0c;运行终端测试是否安装成功2.3、配置环境变量&#xff0c;让nvm能在电脑全局使用2.3.1、nvm配置淘宝镜像2.3.2、nvm环境变量设置 1…

LeetCode124.二叉树中最大路径和

第一次只花了20分钟左右就完全靠自己把一道hard题做出来了。我这个方法还是非常简单非常容易理解的&#xff0c;虽然时间复杂度达到了O(n2)。以下是我的代码&#xff1a; class Solution {int max;public int maxPathSum(TreeNode root) {max Integer.MIN_VALUE;return dfs2(…

Bash脚本调用百度翻译API进行中文到英文的翻译

写一个bash脚本调用百度翻译API进行中文到英文的翻译&#xff0c;首先需要进行相关的申请。看百度给出的文档链接: 百度翻译API文档 需要先注册一个百度账号&#xff0c;然后申请APPID。脚本中会用到appid和key这两个值。按照文档给出的提示可以获得。如下是脚本&#xff1a; #…

人工智能原理复习--搜索策略(一)

文章目录 上一篇搜索概述一般图搜索盲目搜索下一篇 上一篇 人工智能原理复习–确定性推理 搜索概述 问题求解分为两大类&#xff1a;知识贫乏系统&#xff08;依靠搜索技术解决&#xff09;、知识丰富系统&#xff08;依靠推理技术&#xff09; 两大类搜索技术&#xff1a; …

2023.12.7 关于 MySQL 事务详解

目录 事务的四大特性 原子性 一致性 持久性 隔离性 事务并发执行 脏读 不可重复读 幻读 四个隔离级别 read uncommitted read committed repeatable read serializable 事务的四大特性 原子性 一个事务中的所有操作&#xff0c;要么全部完成&#xff0c;要么全部…

MIT线性代数笔记-第26讲-复习二

目录 26.对称矩阵及正定性打赏 26.对称矩阵及正定性 实对称矩阵的特征值均为实数&#xff0c;并且一定存在一组两两正交的特征向量 这对于单位矩阵显然成立 证明特征值均为实数&#xff1a; ​    设一个对称矩阵 A A A&#xff0c;对于 A x ⃗ λ x ⃗ A \vec{x} \lambda…

Pipenv环境配置+Pytest运行

环境配置 使用Pipenv进行虚拟环境管理&#xff0c;Pipfile为依赖模块管理文件。 安装pipenv&#xff1a;brew install pipenv根项目根目录下执行命令创建虚拟环境&#xff1a; pipenv install在Pycharm中指定项目运行的虚拟环境 &#xff1a;File->Settings->Project:-…