数据结构——二叉树

news2024/12/23 6:17:48

二叉树

1 二叉树的种类

1.1 满二叉树

节点数量为 2^k - 1 (k是树的深度,底层的叶子节点都是满的)
在这里插入图片描述

1.2 完全二叉树

完全二叉树是指除了下面一层外,其余层的节点都是满的;
且最下面一层的叶子节点是从左到右连续的。
在这里插入图片描述
下面这个树的底层叶子节点就不是从左到右连续的,所以不是完全二叉树
在这里插入图片描述
满二叉树一定式完全二叉树,完全二叉树不一定是满二叉树。

1.3 二叉搜索树

二叉搜索树对节点的布局是没有要求的;
二叉搜索树对节点的排序有要求:左子树的数据 < 中间节点的数据
右子树的数据 > 中间节点的数据

在这里插入图片描述
下图也是一个二叉搜索树,因为二叉搜索树对节点布局没有要求
在这里插入图片描述

1.4 平衡二叉搜索树

平衡二叉搜索树和二叉搜索树一样也需要排序;
不同的是平衡二叉搜索树对布局有要求:平衡二叉搜索树的左子树和右子树的深度差不能大于1
在这里插入图片描述
在这里插入图片描述

2 二叉树的存储方式

2.1 链式存储

链式存储就是指使用链表的方式存储:
每个节点有三个域:①数据域②左指针③右指针
在这里插入图片描述

2.2 顺序存储

顺序存储是指使用数组存储:
在这里插入图片描述

3 遍历方式

3.1 深度优先遍历

前中后序遍历都属于深度优先遍历,可以使用递归遍历,也可以使用迭代遍历。
如果使用递归遍历,需要牢记三个步骤:
①确定递归函数的参数与返回值
②确定终止条件
③确定单层递归的逻辑

package leetcode.A_4_二叉树的前序遍历;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Watching
 * * @date 2023/4/30
 * * Describe:
 * 二叉树的前序遍历
 */


public class Solution {
    public static void main(String[] args) {
        TreeNode treeNode1 = new TreeNode(1);
        TreeNode treeNode2 = new TreeNode(2);
        TreeNode treeNode3 = new TreeNode(3);
        treeNode1.right = treeNode2;
        treeNode2.left = treeNode3;
        System.out.println(preorderTraversal(treeNode1));
    }


    public static List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        //确定终止条件
        func(list, root);//将具体代码抽象出去
        return list;
    }

    public static void func(List<Integer> list, TreeNode root) {
        if (root != null) {
            list.add(root.val); // 通过改变这行代码的位置就可以实现前序,中序,后序遍历
            func(list, root.left);
            func(list, root.right);
        }
    }
}

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode() {
    }

    TreeNode(int val) {
        this.val = val;
    }

    TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}

3.2 广度优先遍历

广度优先遍历是指一层一层的遍历

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

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

相关文章

pci总线协议学习笔记——PCI总线基本概念

1、pci总线概述 (1)PCI&#xff0c;外设组件互连标准(Peripheral Component Interconnection)&#xff0c;是一种由英特尔&#xff08;Intel&#xff09;公司1991年推出的用于定义局部总线的标准; (2)最早提出的PCI总线工作在33MHz频率之下&#xff0c;传输带宽达到133MB/s(33M…

【LeetCode】236. 二叉树的最近公共祖先

1.问题 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以是…

1992-2022年31省GDP、第一产业增加值、第二产业增加值 第三产业增加值

1992-2022年31省GDP、第一产业增加值、第二产业增加值 第三产业增加值 1、时间&#xff1a;1992-2022年 2、范围&#xff1a;包括31省 3、指标&#xff1a;省GDP、省第一产业增加值、省第二产业增加值、省第三产业增加值 4、缺失情况说明&#xff1a;无缺失 5、来源&#…

【python知识】__init__.py的来龙去脉

一、说明 我们常见__init__.py文件&#xff0c;但说不清楚它的用途&#xff0c;在本文&#xff0c;我将首先把它的来龙去脉说清楚&#xff0c;然后告诉大家&#xff0c;如何编制python工程&#xff0c;培养全局的编程格局。 二、包-模块-函数结构 在Python工程里&#xff0c;当…

playwright连接已有浏览器操作

文章目录 playwright连接已有浏览器操作前置准备打开本地已有缓存的Chrome&#xff08;理解&#xff09;指定端口打开浏览器连接指定端口已启动浏览器&#xff08;推荐&#xff09; playwright连接已有浏览器操作 前置准备 pip install playwright # 安装playwright的python…

红黑树数据结构

现在JAVASE中HashMap中底层源码是由数组链表红黑树进行设计的&#xff0c;然后很多地方也是用到红黑树&#xff0c;这里单独对红黑树数据结构进行简单的介绍。 目录 红黑树概念 红黑树的性质 自平衡规则 代码 红黑树概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;…

linux常用命令大全(保姆及入门)

linux常用命令大全 一、文件处理命令1、目录处理命令&#xff1a;ls2、目录处理命令2.1 mkdir2.2 pwd2.3 rmdir2.4 cp2.5 mv2.6 rm 3.文件处理命令3.1 touch3.2 cat3.3 tac3.4 more3.5 less3.6 head3.7 tail 4.链接命令4.1 ln 二、权限管理命令2.1 chmod2.2 chown2.3 chgrp 2.4…

VRPTW:新雀优化算法NOA求解带时间窗的车辆路径问题

一、新雀优化算法NOA求解带时间窗的车辆路径问题 1.1VRPTW模型如下&#xff1a; 带时间窗的车辆路径问题(Vehicle Routing Problem with Time Windows, VRPTW) 1.2新雀优化算法NOA求解VRPTW close all clear clc SearchAgents_no30; % 种群大小 Function_nameF1; Max_ite…

准备“开黑”,电脑却“告退”?游戏闪退的解决方法

游戏玩家近期可能会发现&#xff0c;不少大作陆陆续续登录PC市场&#xff0c;比如《死亡岛 2》、《无畏契约》等。但也有不少游戏用户会发现&#xff0c;电脑玩游戏时容易出现闪退的情况。特别是在进行高负荷运算的时候&#xff0c;有一些游戏更为容易出现这种情况&#xff0c;…

[架构之路-176]-《软考-系统分析师》-17-嵌入式系统分析与设计 -1- 实时性(任务切换时间、中断延迟时间、中断响应时间)、可靠性、功耗、体积、成本

目录 前言&#xff1a; 1 7 . 1 嵌 入 式 系 统 概 述 1 . 嵌入式系统的特点 (1) 系统专用性强。 (2) 系统实时性强。 (3) 软硬件依赖性强 (4) 处理器专用。 ( 5 ) 多种技术紧密结合。 (6) 系统透明性。 (7) 系统资源受限。 2 . 嵌入式系统的组成 1 7 . 3 嵌入式实…

拷贝构造函数和赋值重载函数详解

1.拷贝构造函数 1.1拷贝构造函数的概念 拷贝构造函数&#xff1a;只有单个形参&#xff0c;该形参是对本类类型对象的引用(一般常用const修饰)&#xff0c;在用已存在的类类型对象创建新对象时由编译器自动调用。拷贝构造函数也是特殊的成员函数&#xff0c;其特征如下&#…

Golang每日一练(leetDay0051)

目录 151. 颠倒字符串中的单词 Reverse Words In A String &#x1f31f;&#x1f31f; 152. 乘积最大子数组 Maximum Product Sub-Array &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一…

【分布式】CAP原则和BASE理论

CAP原则概述 CConsistency一致性AAvailability可用性PPartition tolerance分区容错性 1998年&#xff0c;加州大学的计算机科学家Eric Brewer提出&#xff0c;分布式系统有三个指标 一致性&#xff08;C&#xff09;&#xff1a;在分布式系统中的所有数据备份&#xff0c;在同…

TiDB实战篇-基于索引的SQL优化

简介 TiDB实战篇-基于索引的SQL优化。 Online DDL 允许直接在线执行ddl操作&#xff0c;不会锁表&#xff0c;但是执行多个ddl的时候会要排队。 原理 控制创建索引的速度 查看影响 标红的是加了多少行索引。 添加索引的线上的影响&#xff08;读写频繁&#xff09; 只读场…

Linux程序设计之IP地址转换

1.通常&#xff0c;人们习惯于使用可读性好的字符串来表示IP的地址&#xff0c;但是&#xff0c;在实际的使用过程中&#xff0c;需要使用的IP地址应该为无符号的整数(在计算机中存储时是对应的二进制&#xff0c;只有二进制计算机才能识别&#xff0c;即0、1)。已经封装好的函…

windows开机不自动挂载磁盘的方法

本人的电脑系统为win11 写作时间20230430 开机不挂载某块磁盘的理由 1.本人电脑上有个仓库盘是机械硬盘&#xff0c;并不是每次开机都要用到&#xff0c;开机不挂载也许有利于增加数据盘的寿命 2.挂载了数据盘&#xff0c;有时候打开文件页面会比较慢&#xff0c;不够丝滑 …

MATLAB绘制汽车理论的仿真图片

这里写自定义目录标题 仿真绘图内容发动机最优曲线最优燃油消耗率曲线最优效率曲线工作时间/能量消耗的分布 传统车动力性分析绘制三&#xff08;或多个&#xff09;y坐标轴函数统计数据分布情况函数 仿真绘图内容 从传统车到新能源混合动力车型的不同绘制。 发动机最优曲线 …

排序算法 - 选择排序

文章目录 选择排序介绍选择排序实现选择排序的时间复杂度和稳定性选择排序时间复杂度选择排序稳定性 代码实现核心&总结 每日一道算法&#xff0c;提高脑力。第四天&#xff0c;选择排序。 选择排序介绍 它的基本思想是: 首先在未排序的数列中找到最小(or最大)元素&#…

Vue3超详细的ref()用法,看这一篇就够了

ref()接受一个内部值&#xff0c;返回一个响应式的、可更改的 ref 对象&#xff0c;此对象只有一个指向其内部值的属性 .value。 ref() 将传入参数的值包装为一个带 .value 属性的 ref 对象。 1、ref 对象是可更改的&#xff0c;即可以为 .value 赋予新的值 举例&#xff1a; c…

使用Vscode调试shell脚本 环境搭建基本步骤

操作系统&#xff1a; Linux --CentOS. step1: 在Vscode 中安装Bash Debug Step2:创建一个名字为123.sh的shell脚本&#xff1b; 输入123.sh, 回车: ​​​​​​Step3:编辑简单的待打印的内容,如下&#xff1a; Step4: 配置编译器 修改为下面内容&#xff1a; Step5: 点击按…