30二叉树-了解二叉树

news2024/11/18 15:26:07

目录

树的定义

二叉树(Binary Tree)

二叉树的存储方式

链式存储

顺序存储

二叉树的遍历方式

LeetCode之路——144. 二叉树的前序遍历

分析



树的定义

树结构(Tree Structure)是一种分层的非线性数据结构,它由节点(Node)和边(Edge)组成,用于表示具有层次性关系的数据。树结构的一个关键特点是,每个节点可以有零个或多个子节点,但只有一个父节点(根节点除外)。根节点是树的顶层节点,它没有父节点,而叶子节点是没有子节点的节点。

以下是树结构的一些基本概念和术语:

  1. 节点(Node): 树结构中的每个元素都被称为节点。节点可以包含数据或值,并可能有零个或多个子节点。

  2. 边(Edge): 边是连接节点的线,它表示节点之间的关系。在树结构中,边代表从父节点到子节点的连接。

  3. 根节点(Root Node): 根节点是树的顶层节点,它没有父节点,但可以有零个或多个子节点。

  4. 子节点(Child Node): 子节点是位于某个节点下方的节点,即具有父节点的节点。

  5. 父节点(Parent Node): 父节点是具有子节点的节点。一个节点可以同时作为多个子节点的父节点。

  6. 叶子节点(Leaf Node): 叶子节点是没有子节点的节点,它们通常位于树的末端。

  7. 子树(Subtree): 子树是从某个节点及其所有子节点构成的树,它是原始树的一部分。

  8. 高度(Height): 树的高度是从根节点到最深叶子节点的最长路径的长度。高度也称为深度。

  9. 层级(Level): 树的层级是树中的层次结构,根节点位于第一层,其子节点位于第二层,以此类推。

话不多说,还是画图吧。

二叉树(Binary Tree)

二叉树是一种常见的树状数据结构,它的节点最多有两个子节点:左子节点和右子节点。根据二叉树的特性和结构,可以衍生出多种不同类型的二叉树。以下是一些常见的二叉树种类:

  1. 二叉查找树(Binary Search Tree,BST): 二叉查找树是一种有序二叉树,其中每个节点的值都大于其左子树的所有节点的值,而小于其右子树的所有节点的值。这使得在二叉查找树中可以高效地进行搜索、插入和删除操作。

  2. 平衡二叉树(Balanced Binary Tree): 平衡二叉树是一种特殊的二叉查找树,它保持树的高度相对平衡,从而保证了在最坏情况下的搜索效率为O(log n)。常见的平衡二叉树包括AVL树和红黑树。

  3. 满二叉树(Full Binary Tree): 满二叉树是一种二叉树,除了叶子节点外,每个节点都有两个子节点。满二叉树的高度和节点数之间存在特定的关系,即高度为h的满二叉树有2^h - 1个节点。

  4. 完全二叉树(Complete Binary Tree): 完全二叉树是一种二叉树,除了最后一层,其他层都是满的,最后一层从左到右填充节点。完全二叉树通常用于堆数据结构的实现。

  5. 二叉堆(Binary Heap): 二叉堆是一种特殊的完全二叉树,它可以分为最小堆和最大堆两种类型。最小堆中,每个节点的值小于或等于其子节点的值;最大堆中,每个节点的值大于或等于其子节点的值。二叉堆常用于实现优先队列。

  6. 线索二叉树(Threaded Binary Tree): 线索二叉树是一种特殊的二叉树,它添加了指向前驱和后继节点的线索,以支持更高效的中序遍历。

  7. 自平衡二叉树(Self-Balancing Binary Tree): 这是一类平衡二叉树,包括AVL树、红黑树等,它们通过自动调整树的结构来保持平衡,以确保高效的插入、删除和搜索操作。

二叉树的存储方式

想要存储一棵二叉树,我们有两种方式,链式存储和顺序存储。

链式存储

在链式存储中,二叉树的每个节点都包含数据、左子节点引用和右子节点引用。这种存储方式非常灵活,可以表示各种二叉树结构。

class TreeNode {
    int data;
    TreeNode left;
    TreeNode right;
​
    public TreeNode(int data) {
        this.data = data;
        this.left = null;
        this.right = null;
    }
}
​
// 创建一颗简单的二叉树
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
顺序存储

在数组存储中,二叉树的节点按照特定顺序存储在数组中,通常使用数组的索引来表示节点之间的关系。这种方式可以节省内存,但通常要求二叉树是完全二叉树。

如果节点X存储在数组中下标为i的位置,下标为2 * i 的位置存储的就是左子节点,下标为2 * i + 1的位置存储的就是右子节点。反过来,下标为i/2的位置存储就是它的父节点。通过这种方式,我们只要知道根节点存储的位置(一般情况下,为了方便计算子节点,根节点会存储在下标为1的位置),这样就可以通过下标计算,把整棵树都串起来。

class TreeNode {
    int data;
​
    public TreeNode(int data) {
        this.data = data;
    }
}
​
// 使用数组存储二叉树节点
TreeNode[] treeArray = new TreeNode[7];
treeArray[0] = new TreeNode(1);
treeArray[1] = new TreeNode(2);
treeArray[2] = new TreeNode(3);
treeArray[3] = new TreeNode(4);
treeArray[4] = new TreeNode(5);
treeArray[5] = new TreeNode(6);
treeArray[6] = new TreeNode(7);
​
// 使用数组索引表示节点关系
// 根节点的左子节点在索引1,右子节点在索引2
// 节点2的左子节点在索引3,右子节点在索引4
// 节点3的左子节点在索引5,右子节点在索引6
二叉树的遍历方式

经典的方法有三种,前序遍历、中序遍历和后序遍历。其中,前、中、后序,表示的是节点与它的左右子树节点遍历打印的先后顺序。左节点永远先于右节点,什么顺序决定节点本身打印的位置。

  • 前序遍历是指,对于树中的任意节点来说,先打印节点,然后再打印它的左子树,最后打印它的右子树。

  • 中序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它,最后打印它的右子树。

  • 后序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它的右子树,最后打印它本身。

LeetCode之路——144. 二叉树的前序遍历

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

示例 1:

img

输入:root = [1,null,2,3]
输出:[1,2,3]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

示例 4:

img

输入:root = [1,2]
输出:[1,2]

示例 5:

img

输入:root = [1,null,2]
输出:[1,2]

提示:

  • 树中节点数目在范围 [0, 100]

  • -100 <= Node.val <= 100

分析

二叉树的递归求前序排列。

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<Integer>();
        preorder(root, result);
        return result;
    }
​
    public void preorder(TreeNode root, List<Integer> result) {
        if (root == null) {
            return;
        }
        result.add(root.val);
        preorder(root.left, result);
        preorder(root.right, result);
    }
}
  • 时间复杂度:O(n)

  • 空间复杂度:O(n)

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

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

相关文章

【OpenCV实现鼠标绘图,轨迹栏做调色板,图像的基本操作】

文章目录 鼠标绘图轨迹栏做调色板图像的基本操作 鼠标绘图 在OpenCV中操作鼠标事件 函数&#xff1a;cv.setMouseCallback() 目的是在鼠标双击的地方画一个圆。首先&#xff0c;我们需要创建一个鼠标回调函数&#xff0c;该函数会在鼠标事件发生时执行。鼠标事件包括左键按下…

PyQt学习笔记-获取Hash值的小工具

目录 一、概述1.1 版本信息&#xff1a;1.2 基本信息&#xff1a;1.2.1 软件支持的内容&#xff1a;1.2.2 支持的编码格式 1.3 软件界面图 二、代码实现2.1 View2.2 Controller2.3 Model 三、测试示例 一、概述 本工具居于hashlibPyQtQFileDialog写的小工具&#xff0c;主要是…

中国移动启动算网大脑“天穹”全网试商用

10月12日&#xff0c;中国移动在2023全球合作伙伴大会主论坛正式启动算网大脑“天穹”全网试商用&#xff0c;全面开启算力网络2.0新征程&#xff0c;标志着中国移动算力网络迈向“融合统一”新阶段。 为落实国家“东数西算”战略&#xff0c;中国移动开创性提出算力网络新理念…

操作系统【OS】微内核

基本概念 微内核结构将操作系统划分为两大部分&#xff1a;微内核多个服务器微内核包含&#xff1a; 与硬件处理紧密相关的部分一些较基本的功能客户和服务器间的通信客户与服务器之间是借助微内核提供的消息传递机制来实现交互的 基本功能 进程管理 进程的通信、切换、调度…

【算法练习Day24】递增子序列全排列全排列 II

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 递增子序列容易出错的地方 …

微信手续费2023标准

不管是微信还是支付宝&#xff0c;商户最低的收款手续费率可以达到0.2%费率。一般我们普通商户的收款费率一般在0.6左右&#xff0c;当然也有使用0.3的&#xff0c;也就是1万元的费率是30-60块钱&#xff0c;对于一些流水比较大的商家来说&#xff0c;确实很有必要把这个手续费…

【实用技巧】Latex写算法伪代码(格式篇)

本文主要介绍个人在编写Latex算法伪代码时所遇到的格式问题。 目录 包冲突换行与缩进算法换页 包冲突 \usepackage{algorithm} \usepackage{algorithmic} \usepackage{algorithmicx} \usepackage{algpseudocode} 网上查找算法伪代码第三方包&#xff0c;主要会跳出来这四…

虹科案例 | 瑞士Agroscope研究所利用压力传感器自动测量反刍动物(奶牛)的咀嚼运动

——用于动物测量研究的数据记录仪&#xff1a;虹科MSR145 瑞士Agroscope研究所隶属于联邦农业办公室&#xff0c;是农业、食品和环境领域可持续发展的推动力量&#xff0c;为农业和环境政策决策以及法规执行提供科学和技术基础。 作为Agroscope研究所的合作代表&…

【超详细】CentOS 7安装MySQL 5.7【安装及密码配置、字符集配置、远程连接配置】

准备工作&#xff1a;CentOS 7系统&#xff0c;并确保可以联通网络 1、获取MySQL 5.7 Community Repository软件包 注意&#xff1a;这里使用的是root用户身份。 wget https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm2、安装软件包 rpm -ivh mysql5…

PyTorch入门教学——TensorBoard使用

1、TensorBoard简介 TensorBoard是Google开发的一个机器学习可视化工具。其主要用于记录机器学习过程&#xff0c;例如&#xff1a; 记录损失变化、准确率变化等记录图片变化、语音变化、文本变化等。例如在做GAN时&#xff0c;可以过一段时间记录一张生成的图片绘制模型 2、…

数字秒表VHDL启动暂停清零,源码和视频

名称&#xff1a;数字秒表VHDL启动暂停清零&#xff08;代码在文末付费下载&#xff09; 软件&#xff1a;Quartus 语言&#xff1a;VHDL 代码功能&#xff1a; 数字秒表 使用VHDL语言设置数字秒表。要求具有百分秒、秒和分钟显示,百分秒范围00-99,秒范围00-59,分钟范围0…

《java 桌面软件开发》swing 以鼠标为中心放大缩小移动图片

swing 使用Graphic2D 绘制图片&#xff0c;要实现对图片进行缩放和自由拖动。 1.以鼠标所在的位置为中心&#xff0c;滚轮控制缩放 2.缩放后再支持鼠标拖动。 基本原理&#xff1a; 利用scale() 函数。进行缩放。但是要注意的地方是&#xff0c;如果是在 public void paintCom…

Linux 下安装配置部署MySql8.0

一 . 准备工作 MySQL安装包&#xff1a;在官网下载需要的版本&#xff0c;这里我用的版本是 MySQL 8.0.34 https://dev.mysql.com/downloads/mysql/ 本次linux机器使用的是阿里云ECS实例 二 . 开始部署 1. 将安装包上传至服务器 解压到当前文件夹 tar -zxvf mysql-8.0.34…

Python 实现http server接收mutipart/form-data文件 方法1

Python 实现http server接收mutipart/form-data文件 方法1 1 Server端代码2 客户端截图3 代码说明 1 Server端代码 import os from flask import Flask, request from werkzeug.utils import secure_filenameapp Flask(__name__) app.config[UPLOAD_FOLDER] E://recv//app.ro…

玩游戏缺失“d3d11.dll丢失“的问题的五种解决方案

在我日常的计算机维护工作中&#xff0c;经常遇到一些用户报告他们遇到了"d3d11.dll丢失"的问题。这是一个常见的Windows系统错误&#xff0c;通常会导致程序无法正常运行。在这篇文章中&#xff0c;我将分享我找到的五种有效的解决方法&#xff0c;以帮助这些用户解…

开源的容器运行时项目 Podman

本心、输入输出、结果 文章目录 开源的容器运行时项目 Podman前言Podman 简介Podman 与 Docker 的区别Podman 在使用上和 Docker 有什么区别从构建者角度分析 Podman 在使用上和 Docker 有什么区别从使用者角度分析 Podman 在使用上和 Docker 有什么区别 Podman 常用命令容器镜…

Linux shell编程学习笔记14:编写和运行第一个shell脚本hello world!

* 20231020 写这篇博文断断续续花了好几天&#xff0c;为了说明不同shell在执行同一脚本文件时的差别&#xff0c;我分别在csdn提供线上Linux环境 &#xff08;使用的shell是zsh&#xff09;和自己的电脑上&#xff08;使用的shell是bash&#xff09;做测试。功夫不负有心人&am…

详解如何利用Pytest Cache Fixture实现测试结果缓存

这篇文章主要为大家详细介绍了如何利用Pytest Cache Fixture实现测试结果缓存,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下− 前言 接口自动关过程中&#xff0c;经常会遇到这样一些场景&#xff0c;“请求2需要用到请求1响应的数据”&#xff0c;常见的…

人脸识别顶会论文及源码合集,含2023最新

今天和大家聊聊人脸识别。 人脸识别的技术经过不断发展已经相当成熟&#xff0c;在门禁、监控、手机解锁、移动支付等实际场景都能看到。我们比较熟悉的识别方式是基于可见光图像的人脸识别&#xff0c;这种方式有个非常明显的缺点&#xff1a;光线限制。 在近两年的人脸识别…

如何解决NSIS 2G文件的限制

Internal compiler error #12345: error mmapping datablock to 33556079.Note: you may have one or two (large) stale temporary file(s) left in your temporary directory (Generally this only happens on Windows 9x). 最近在使用NSIS打包一个7.3GB的可执行程序时&…