算法学习之二叉树

算法导论学习笔记(七):二叉树 前言 昨天看算法导论看到二叉查找树,虽然以前学数据结构的时候已经学过了二叉树,但感觉自己很多东西已经忘了,为 了更好的学习二叉查找树以及后面所涉及到的二叉树方面的相关算法,故再一次复习了下二叉树。并在这写个复习笔 记,便于以后的复习。 定义 学习二叉树之前,肯定得了解数据结构中的树。数据结构中的树和我们现实中的树还是有一点区别的。首先数据结构 中的树与现实相比是倒立的。其次数据 阅读详情

概念

每个节点最多有两个的子节点的树,称为二叉树,二叉树是最基础的树,其他的算法树大多是在二叉树的前提下加以限制,或有特殊要求。

二叉树的相关术语:

  • 节点:包含一个数据元素及若干指向子树分支的信息,一般一个节点所包含的属性有:节点数值,左节点,右节点

  • 节点的度:一个节点拥有子树的数目称为节点的度,即一个节点有几个子分支,没有子节点度为0,仅有一个子节点度为1,以此类推

  • 叶子节点:也称为终端节点,没有子树的节点或者度为零的节点

  • 分支节点:也称为非终端节点,度不为零的节点称为非终端节点

  • 树的度:树中所有节点的度的最大值

  • 节点的层次:从根节点开始,假设根节点为第1层,根节点的子节点为第2层,依此类推,如果某一个节点位于第L层,则其子节点位于第L+1层

  • 树的深度:也称为树的高度,树中所有节点的层次最大值称为树的深度

  • 有序树:如果树中各棵子树的次序是有先后次序,则称该树为有序树

  • 无序树:如果树中各棵子树的次序没有先后次序,则称该树为无序树

  • 森林:由m(m≥0)棵互不相交的树构成一片森林。如果把一棵非空的树的根节点删除,则该树就变成了一片森林,森林中的树由原来根节点的各棵子树构成

二叉树的性质

  • n0 + n2 = n

  • n0 = n2 + 1

  • 2* n2 + 1 = n

  • n2 = (n-1)/2

数字为节点的度

二叉树的创建

在java中创建一个二叉树分为两部分:节点和树

这里直接上代码

/**节点类**/
class TreeNode {
    private int id;
    private String name;
    private TreeNode left;
    private TreeNode right;

    @Override
    public String toString() {
        return "TreeNode{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

    public TreeNode(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public TreeNode() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public TreeNode getLeft() {
        return left;
    }

    public void setLeft(TreeNode left) {
        this.left = left;
    }

    public TreeNode getRight() {
        return right;
    }

    public void setRight(TreeNode right) {
        this.right = right;
    }
}

/**树类**/
class BinaryTree{
    private TreeNode root;

    public void setRoot(TreeNode root) {
        this.root = root;
    }
}

 有了这两个类,我们只需创建几个节点,将其中一个节点设置为树的根结点,并将其余的节点放在其左右节点即可

public class BinaryTreeDemo {
    public static void main(String[] args) {
        // 先创建二叉树的节点
        BinaryTree binaryTree = new BinaryTree();
        TreeNode root = new TreeNode(1,"嘉然");
        TreeNode node2 = new TreeNode(2,"向晚");
        TreeNode node3 = new TreeNode(3,"乃琳");
        TreeNode node4 = new TreeNode(4,"贝拉");
        TreeNode node5 = new TreeNode(5,"珈乐");

        // 手动创建二叉树
        binaryTree.setRoot(root);
        root.setLeft(node3);
        root.setRight(node2);
        node2.setRight(node4);
        node2.setLeft(node5);
    }
}

此时我们就创建好了一个二叉树,如图

二叉树的遍历

二叉树的遍历有三种:先序遍历,中序遍历,后序遍历

  • 先序遍历

    • 遍历顺序为根、左、右,即先遍历一个树的根结点,在遍历其左子树,最后是右子树,遍历是一个递归的过程,直到遍历到没有左右子节点的叶子节点返回上一层

    • 先序遍历输出上述二叉树的结果为:1、3、2、5、4

  • 中序遍历

    • 遍历顺序为左、根、右,即先遍历一个树的左子树,在遍历其根结点,最后是右子树,遍历是一个递归的过程,直到遍历到没有左右子节点的叶子节点返回上一层

    • 中序遍历输出上述二叉树的结果为:3、1、5、2、4

  • 后序遍历

    • 遍历顺序为左、右、根,即先遍历一个树的左子树,在遍历其右子树,最后是根结点,遍历是一个递归的过程,直到遍历到没有左右子节点的叶子节点返回上一层

    • 中序遍历输出上述二叉树的结果为:3、5、4、2、1

这里给出三种遍历打印和查找的代码

class TreeNode {

    // 先序遍历(根 左 右)
    public void preOrder() {
        System.out.println(this);
        if (this.left != null) {
            this.left.preOrder();
        }
        if (this.right != null) {
            this.right.preOrder();
        }
    }

    // 中序遍历(左 根 右)
    public void infixOrder() {
        if (this.left != null) {
            this.left.infixOrder();
        }
        System.out.println(this);
        if (this.right != null) {
            this.right.infixOrder();
        }
    }

    // 后序遍历(左 右 根)
    public void postOrder() {

        if (this.left != null) {
            this.left.postOrder();
        }
        if (this.right != null) {
            this.right.postOrder();
        }
        System.out.println(this);
    }

    /**
     * 先序查找
     * @param id
     * @return
     */
    public TreeNode preFind(int id) {
        TreeNode treeNode = null;
        if (this.id == id) {
            treeNode = this;
            return treeNode;
        }
        if (this.left != null) {
            treeNode = this.left.preFind(id);
        }
        if (this.right != null) {
            treeNode = this.right.preFind(id);
        }
        return treeNode;
    }

    /**
     * 中序查找
     * @param id
     * @return
     */
    public TreeNode infixFind(int id) {
        TreeNode treeNode = null;
        if (this.left != null) {
            treeNode = this.left.infixFind(id);
        }
        if (this.id == id) {
            treeNode = this;
            return treeNode;
        }
        if (this.right != null) {
            treeNode = this.right.infixFind(id);
        }
        return treeNode;
    }

    /**
     * 后序查找
     * @param id
     * @return
     */
    public TreeNode postFind(int id) {
        TreeNode treeNode = null;
        if (this.left != null) {
            treeNode = this.left.postFind(id);
        }
        if (this.right != null) {
            treeNode = this.right.postFind(id);
        }

        if (this.id == id) {
            treeNode = this;
            return treeNode;
        }
        return treeNode;
    }
}

class BinaryTree{
    /**
     * 先序查找
     * @param id
     * @return
     */
    public TreeNode preFind(int id){
        if (this.root == null){
            System.out.println("二叉树为空");
            return null;
        }else {
            return root.preFind(id);
        }
    }

    /**
     * 中需查找
     * @param id
     * @return
     */
    public TreeNode infixFind(int id){
        if (this.root == null){
            System.out.println("二叉树为空");
            return null;
        }else {
            return root.infixFind(id);
        }
    }

    /**
     * 后序查找
     * @param id
     * @return
     */
    public TreeNode postFind(int id){
        if (this.root == null){
            System.out.println("二叉树为空");
            return null;
        }else {
            return root.postFind(id);
        }
    }

    // 先序遍历
    public void preOrder(){
        if (this.root != null) {
            root.preOrder();
        }else {
            System.out.println("二叉树为空,无法遍历");
        }
    }

    // 中序遍历
    public void infixOrder(){
        if (this.root != null){
            root.infixOrder();
        }else {
            System.out.println("二叉树为空,无法遍历");
        }
    }

    // 后序遍历
    public void postOrder(){
        if (this.root != null){
            root.postOrder();
        }else {
            System.out.println("二叉树为空,无法遍历");
        }
    }
}
python算法学习——二叉树 二叉树相关题目学习记录。。 阅读详情

相关推荐

二叉树排序非递归算法学习笔记

最近在学习数据结构,在这写一下二叉树的前序、后序和中序的递归遍历和非递归遍历算法和实现。 1、二叉树的前序遍历: 1)递归遍历算法和实现:根节点>>左孩子>>右孩子 void preOrder(MyStruct *proot) { if (proot != nullptr) { cout << proot->Nodedata <&lt...

梦想天空的博客 1106

数据结构与算法之二叉树大全

二叉树的定义 二叉树的性质(特性) 满二叉树与完全二叉树 链式存储的二叉树 顺序存储的二叉树 线索二叉树(Threaded BinaryTree) 二叉排序树(Binary Sort Tree) 平衡二叉树( Balanced Binary Tree) 为什么使用平衡二叉树? 如何判断平衡二叉树? 相关概念 旋转方式 实例 代码实现...

努力让自己发光,对的人才能迎着光而来 2万+

手把手教你用DCA1000EVM解析IWR6843毫米波雷达数据(附MATLAB代码)

本文提供了一份详尽的实战指南,手把手教你使用DCA1000EVM采集并解析TI毫米波雷达IWR6843的原始数据。内容涵盖硬件连接配置、mmWave Studio参数设置、LVDS数据流结构解析,并附有核心MATLAB代码,详细演示了从原始二进制文件到距离-速度谱的信号处理全链路,帮助开发者快速掌握数据解析与处理的关键步骤。

terraform7cloud的博客 228

算法 - 二叉树的基本算法

目录 一、二叉树 二、二叉树的先序、中序、后序遍历 (一)、递归遍历 (二)、非递归遍历 (1)先序:头左右 (2)中序:左头右 (3)后序:左右头 三、实现二叉树的按层遍历 (一)、遍历-队列 (二)、求最大层的宽度 四、二叉树的序列化和反序列化 (一)、递归 (二)、按层 一、二叉树 图示: 结构: public class BtreeNode { public int value; public BtreeNode left; pub..

weixin_40459875的博客 6695

【ESP32】1.编译、烧录、创建工程

本文介绍了在VSCode中搭建ESP32开发环境并烧录"Hello World"工程的过程。首先通过串口工具成功下载固件后,解决了OpenOCD报错问题。针对头文件无法识别的问题,修改了c_cpp_properties.json配置文件,调整了编译器路径和IntelliSense模式。文章还详细说明了创建新工程的步骤,包括选择芯片型号和项目模板,并验证了串口打印功能。最后提醒在项目构建时要等待完成,避免文件缺失。整个流程涵盖了环境搭建、代码烧录、调试及新项目创建等关键环节。

梁山1号 1485

倒立摆入门详解+pid调参

倒立摆制作全过程 最近在练习pid的控制算法,就选用了2013年的电子设计国赛题目:倒立摆 。 首先给你们看看我的成果 注意哦:倒立摆不是靠上面黄色的传感器保持平衡的,而是通过下面的电机左右扭动使得摆杆不掉下来,难度可不小了。 材料准备 1.机械部分 如图所示选好电机和角位移传感器进行组装就好了,这个部分是我直接网上购买的,如果要自己装也是可以的,不过会比较麻烦,结构差不多的。 2.主控部分 这个部分的话完全是我自己设计的,作用和网上买的一样,因为网上买的话太贵了,有需要的话可以联系我,有pcb文件

small_po_kid的博客 2万+

二叉树相关算法汇总(详细)

二叉树基本知识 二叉树(Binary Tree)是n(n≥0)个有限元素的集合,该集合或者为空,或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成。当集合为空时,称该二叉树为空二叉树。 二叉树常见概念: 结点的度。结点所拥有的子树的个数称为该结点的度。 叶子结点。度为0的结点称为叶子结点,或者称为终端结点。 分支结点。度不为0的结点称为分支结点,或者称为非终端结点。一棵树的结点除叶子结点外,其余的都是分支结点。 左孩子、右孩子、双亲。树中一个结点的子树的根结点称为这个结

泛泛之素 1万+

5ZCM6ZGrVDllSFLkv6Hmga/ljJbnrqHnkIbns7vnu58= GetFlowDropDown SQL注入

5ZCM6ZGrVDllSFLkv6Hmga/ljJbnrqHnkIbns7vnu58=、eHR/OA一体化智慧云平台、智慧一卡通云平台、行业软件开发与定制、智慧企业管理信息化咨询与项目服务为核心业务的顾问式管理咨询和软件个性定制开发的高科技股份集团公司。同鑫T9eHR信息华管理系统存在SQL注入漏洞,攻击者可通过该漏洞上传shell。关闭互联网暴露面或接口设置访问权限。利用sqlmap进行shell。

iSee857的博客 701

二叉树算法(带你了解其原理 实现方法)

二叉树是一种递归定义的数据结构,具有以下特点:(1)每个节点最多有两个子节点,通常称为左子节点和右子节点。(2)二叉树可以是空树,也可以只有一个根节点,或者具有多个节点。(3)二叉树的每个节点都包含数据域和指针域。数据域存储节点的数据,指针域则存储指向左子节点和右子节点的指针。二叉树作为一种常见的数据结构,在计算机科学中具有重要的应用价值。本文详细介绍了二叉树的基本概念、遍历算法、插入算法和删除算法,希望能为读者提供清晰、有条理的二叉树算法解析。

2303_79387663的博客 2074

脑电信号处理实战 01 | 从 0 跑通第一个 EEG 分析:加载、滤波、频谱与“睁眼闭眼“

本文以 UCI 公开数据集"EEG Eye State"为例,从零走通脑电处理的完整流水线——数据加载、1–40 Hz 带通滤波、Welch 功率谱、频带功率、通道相关性与箱线图质控、睁闭眼对比和时频分析,并用 8 张科研风格图层层揭示这份数据中的伪迹与通道重复问题,说明"流程跑得通不等于结果可信,质量控制永远先行"。

qq_53529450的博客 118

【1】Python交叉编译到OpenHarmony标准系统运行(arm32位)

本文介绍如何Python语言如何在OpenHarmony标准系统运行,包括5.0r和4.1r以及4.0r,和未来版本的OpenHarmony版本上。 Python语言在OpenHarmony上使用,需要将Python解释器CPython移植到OpenHarmony标准系统。通过交叉编译的方式。

weixin_58069108的博客 930

二叉树的详解与常见算法实现

文章目录一、 二叉树的基本概念 一、 二叉树的基本概念 **二叉树:**二叉树是每个节点最多有两个子树的树结构。 **根节点:**一棵树最上面的节点称为根节点。 父节点、子节点:如果一个节点下面连接多个节点,那么该节点称为父节点,它下面的节点称为子 节点。 **叶子节点:**没有任何子节点的节点称为叶子节点。 **兄弟节点:**具有相同父节点的节点互称为兄弟节点。 **节点度:**节点拥有的子树数。上图中,13的度为2,46的度为1,28的度为0。 **树的度:**所有结点的度数的最大值。二叉树的度小于等

weixin_39318565的博客 5061

【UE5】RTS游戏的框选功能+行军线效果实现

步骤: 一、项目准备; 二、框选NPC并移动到指定地点; 三、框选效果; 四、行军线效果

ChaoChao66666的博客 2379

二叉树算法学习

二叉树的算法的学习

weixin_41185097的博客 73

Autosar Configuration(十四)SomeIP之配置SoAd

本文主要介绍SomeIp协议栈中的SoAd在Configurator中的详细配置

king110108的专栏 2602

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

学习笔记—数据结构—二叉树(算法题)

在之前我们学习了二叉树顺序实现和二叉树(链式),那么我们将进入算法题部分,Let's Go!

2401_83231468的博客 1244

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

算法学习——二叉树

我们来看看链式存储的二叉树节点的定义方式。int val;

qq_24867003的博客 1376

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

算法第12天|继续学习二叉树:翻转二叉树、对称二叉树、二叉树最大深度、二叉树的最小深度

二叉树的深度,就是根节点到叶子节点的最远距离,可以使用递归的形式,从最下边开始计算节点的高度,直到根节点;此时的最小深度应该需要是从拥有的子节点的那条路径进行往下,所以需要在最大深度的代码上添加限制条件:出现一个子节点的时候要如何?迭代法就是在层序遍历迭代法的模板上,添加限制条件:寻找最先遇到的叶节点(左右子节点都没有)可以看作是两棵子树的关系,可以通过对左右两棵子树的对应位置进行判断:使用递归、迭代(两个对应节点一组入栈或队)(2)每次取出对应的两个节点,用于判断当前两个节点是不是相同(对称)

m0_47408374的博客 1462

0-1的算法学习之路 二叉树篇

说白了,就那么一点数据,根据遍历的顺序不同,产生不同的访问顺序。

ttjkp_L的博客 224

算法学习———二叉树(Java版)

本周leetcode刷题路线:二叉树算法题常用方法:递归算法 递归算法基本思路:只考虑部分,不考虑整体;101. 对称二叉树(简单): 题目描述: 给你一个二叉树的根节点 , 检查它是否轴对称。 示例: 输入:root = [1, 2, 2, 3, 4, 4, 3] 输出:true 解题思路: 检查该二叉树是否为对称二叉树,即检查该二叉树根节点的左子树翻转后是否与右子树相等(226.

Sencq的博客 1118

二叉树的深入学习与算法总结

二叉树作为数据结构中的一个重要概念,不仅在计算机科学中有着广泛的应用,如在数据库的索引、文件系统的组织、操作系统的内存管理等,而且在算法题目中也是一个常客。本文将对二叉树的常见问题进行深入探讨,并总结解题思路和算法实现。

Hhjhj255的博客 1288

数据结构与算法学习笔记:二叉树

写在前面:记录学习《恋上数据结构与算法》的过程。 课程链接地址:https://ke.qq.com/course/385223 目录 树形结构 树的基本概念 二叉树(Binary Tree) 二叉树(Binary Tree)的性质 真二叉树(Proper Binary Tree) 满二叉树(Full Binary Tree) 完全二叉树(Complate Binary Tree) 完全二叉树(Complate Binary Tree)的性质 面试题 国外教材概念 树形结构

baidu_41388533的博客 314

二叉树的遍历【学习算法】

二叉树的遍历【学习算法】

小心星的博客 284

算法学习-二叉树深度、相同、平衡、右视图

算法学习

qq_45634787的博客 369

算法学习笔记(六):二叉树一创建、插入、删除、BFS

给定两个整数数组 preorder 和 inorder,其中 preorder 是二叉树的前序遍历,inorder 是同一。给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value,将值插入二叉搜索树,返回。插入后二叉搜索树的根节点,输入数据保证,新值和原始二叉搜索树中任意节点值不同。是p、q的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)给你一个二叉树的根节点 root,判断是否是一个有效的二叉搜索树。给你二叉树的根节点 root,返回其节点值的 层序遍历。

Ice166的博客 718

学习算法第五天(二叉树)

本文总结了二叉树常见问题的解法,涵盖对称性判断、合并、镜像转换、BST验证、完全二叉树判断和平衡性检查等场景。所有解法均提供递归和迭代两种实现方式,并分析时间/空间复杂度。 关键解法包括:利用镜像遍历判断对称性(递归/队列);同步遍历合并两棵树(DFS/BFS);交换左右子树实现镜像;上下界检查或中序遍历验证BST;层序遍历检测完全二叉树;后序遍历计算高度差判断平衡性。 这些解法展示了二叉树问题的核心思路:通过递归或迭代遍历,在适当位置进行节点比较、子树操作或状态维护,同时注意空指针处理。不同遍历顺序(前序

qq_74909129的博客 260
上一篇: 算法学习汇总
下一篇: 算法学习之二叉排序树
管管儿
博客等级 码龄7年 1粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值