二叉树的基本概念及运用

二叉树的概念:一棵二叉树是结点的一个有限集合,该集合:

1.或者为空

2.或者是由一个根节点加上两棵别称为为左子树和右子树的二叉树组成。

2.2: 两种特殊的二叉树: 

1.满二叉树:一课二叉树,如果每层的结点数都达到最大值,则这棵二叉树就是满二叉树。

2.完全二叉树:除了最底层,其他层的结点必须是满的,即每层的结点数都达到最大值。同时,最后一层的结点必须从左到右连续排列,可能没有填满,但不能有空缺。

2.3. 二叉树的一些基本性质:

1.若规定根结点的层数为1,则规定非空二叉树的第i层有 2^i-1 个结点.

2.若规定只有根结点的二叉树深度为1,则深度为k的二叉树的最大结点为2^k-1.

3.对于任意一棵二叉树,如果其叶结点的个数为n0,度为2的非叶结点个数为n2,则n0 = n2 + 1;

4.具有n个结点的完全二叉树的深度k为log2(n+1) 取整。

2.4:二叉树的存储:

二叉树的存储结构分为:顺序存储和类似于链表的链式存储。

我们主要介绍链式存储:

二叉树的链式存储主要是通过一个一个的结点引用起来的,具体表示如下:

//孩子表示法:
    class Node {
        int val; //数据域
        Node left; //左孩子的引用,代表左孩子为根的整棵左子树
        Node right; //右孩子的引用,代表右孩子为根的整棵右子树
    }

    //孩子双亲表示法
    class Node {
        int val; //数据域
        Node left; //
        Node right;
        Node parent; //当前结点的根节点
    }

2.5:二叉树的基本创作:

2.5.1:二叉树的简单速成创建(非正式):

//二叉树的速成简单创建
      public class BinaryTree {
        public static class BTNode {
            BTNode left;   //左孩子引用
            BTNode right;   //右孩子引用
            int value;    //值得大小

            public BTNode(int value) { //构造方法
                this.value = value;  //值得赋值
            }
        }

        private BTNode root; //根节点

        public void creatBinaryTree() {
            BTNode node1 = new BTNode(1);
            BTNode node2 = new BTNode(2);
            BTNode node3 = new BTNode(3);
            BTNode node4 = new BTNode(4);

            root = node1;//根节点的赋值
            node1.left = node2; //将node2赋值给node1的左节点
            node2.left = node3; //node3赋值给node2的左节点
            node1.right = node4; //node4为node1的右节点
        }
    }

 2.5.2:二叉树的遍历:

   所谓遍历,是指沿着某条搜索路线,依次对树中每个节点均做一次且仅做一次访问

  访问结点所进行的操作依赖具体的问题。

前序遍历: ----    访问根结点---> 根的左子树------> 根的右子树

以上图为例,1为根结点,按照 根节点--> 左子树---> 右子树方式进行递归:

递归后的顺序为:123456

具体代码如下:

public void preOrder (Node root){
        if(root == null){
            return;
        }
        System.out.println(root.val+" "); //打印根节点
        preOrder(root.left); //遍历左子树
        preOrder(root.right); //遍历右子树


    }


中序遍历:----     根的左子树----> 根节点-----> 根的右
子树

以图为例,按照 左子树--> 根节点---> 右子树 的方式进行递归

递归后结果: 321546

具体代码如下:

后序遍历:----     根的左子树-----> 根的右子树 ---->根结点

按照左子树 ---> 右子树---> 根结点进行递归后:

递归结果:  325641

public void postOrder(Node root){
        if(root == null){
            return; 
        }
        postOrder(root.left);
        postOrder(root.right);
         System.out.println(root.val);
         
     }

二叉树的基本操作:

1.size():获取树结点的个数jinjin

判断当前节点是否为空,不为空,nodeSize++,同时分别遍历左右树。

size2: 省去了nodeSize++,返回值直接+1

 public static int nodeSize = 0;
//获取树中结点的个数
  public void size( Node root){
       if(root == null){
           return ;
       }
       //分别左右树遍历,遍历之前都将nodeSize++
       nodeSize++;
       size(root.left);
       size(root.right);
  }
  public int size2(Node root){
      if(root == null){
          return 0;
      }
      return size2(root.left)+size2(root.right)+1;
  }

2.获取叶子节点个数:

何为叶子节点? 当前节点没有左子树和右子树。

判断当前节点是否为空,不为空,判断当前节点的左子树和右子树是否同时为空,为空,将leafsize++;

随后递归遍历左右子树

public static int leafSize;
       public void getLeafSize(Node root){
           //判断根结点是否为空
           if(root ==null){
               return  ;
           }
           //叶子结点:当前结点无左结点和右结点
           if(root.left == null && root.right == null){
               leafSize++;
           }

3.获取第k层节点的个数:

 

判断当前节点是否为空。(root是否为null)

2.判断k是否为1,为1,即为根节点,return1即可

3。 未达到目标层数,通过递归查找root的左右子树,同时每次递归时k-1,代表进入下一层级

 public int getKLevelNodeCount(Node root,int k){
           if(root == null){
               return 0;
           }
           if(k == 1){
               return 1;
           }
           return getKLevelNodeCount(root.left,k-1)+ getKLevelNodeCount(root.right,k-1);

    }

4.获取二叉树的高度:

优先递归遍历左子树,再从下往上遍历右子树

以上图为例,遍历左子树至D,D!=null, 遍历D的左子树,返回0,再遍历右子树,也返回零,此时

判断左子树>右子树 ,是的话,返回left+1,否则返回right+1. 依次从往上递归

 //获取二叉树的高度:
     public int getHeight(Node root){
           if(root == null){
               return 0;
           }
           //
           int leftHeight = getHeight(root.left); //递归遍历得到左子树高度,变量存储在leftHeight中
            int rightHeight = getHeight(root.right); //递归遍历得到右子树高度,变量存储在rightHeight中


           return leftHeight>rightHeight ?  leftHeight+1 : rightHeight+1; //+1原因: 将当前结点的高度保留在内

     }

5.找到树里对应的值:

判断当前节点是否为空,不为空,判断root.val是否 == val ,

若不等, 递归遍历左树查找对应的值,创建新树left来接受每次递归的树,递归结束若左树最终不为空,返回左树,右数同理。

    public Node finalVal(Node root,int val){
           if(root == null){
               return null;
           }
           //根节点 == val
        if(root.val == val){
            return root;
        }
        Node leftNode = finalVal(root.left,val);//遍历左子树查找对应的值
        if(leftNode != null){
            return leftNode;
        }

        Node rightNode = finalVal(root.right,val); //遍历右子树
        if(rightNode != null){
            return rightNode;
        }
        //如果左右树都没有遍历到:
        return null;

    }

}

今天的代码就到这里了,喜欢的老铁来个三连吧!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Z-BlogPHP显示错误Undefined array key 0 (set_error_handler)的解决办法

今天打开博客的时候,意外发现页面,打开均显示错误:Undefined array key 0 (set_error_handler)。 博客程序采用的是Z-BlogPHP。百度了一圈没有找到解决办法,在官方论坛里也没找到解决办法。 于是开始自己排查原因。我服务器采用…

问:MySQL表过大,你有哪些优化实践?

当MySQL单表记录数过大时,数据库的CRUD(创建、读取、更新、删除)性能会明显下降。为了提升性能,我们需要采取一些优化措施。本文将详细介绍几种常见的优化方案。 1. 限定数据的范围 描述 务必禁止不带任何限制数据范围条件的查…

新品发布:Manus Metagloves Pro虚拟现实手套

Manus 全新发布的 Metagloves Pro量子追踪手套能够支持您捕捉手部的每一个细节动作,您的手指捕捉将不再有任何限制。Manus Metagloves Pro可帮助您节省在制作动画时的宝贵时间,提供更加真实的手部动作表现。 Manus Metagloves Pro支持快速设置&#xff0…

C++从入门到起飞之——红黑树 全方位剖析!

🌈个人主页:秋风起,再归来~🔥系列专栏:C从入门到起飞 🔖克心守己,律己则安 目录 1. 红⿊树的概念 2. 红⿊树的实现 2.1 构建整体框架 2.2 红黑树的插入 2.3 红黑树的验证 2.4 红黑树…

解决JAVA使用@JsonProperty序列化出现字段重复问题(大写开头的字段重复序列化)

文章目录 引言I 解决方案方案1:使用JsonAutoDetect注解方案2:手动编写get方法,JsonProperty注解加到方法上。方案3:首字母改成小写的II 知识扩展:对象默认是怎样被序列化?引言 需求: JSON序列化时,使用@JsonProperty注解,将字段名序列化为首字母大写,兼容前端和第三方…

万字图文实战:从0到1构建 UniApp + Vue3 + TypeScript 移动端跨平台开源脚手架

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🍃 vue-uniapp-template 🌺 仓库主页: Gitee 💫 Github &#x1f…

使用 NumPy 和 Matplotlib 实现交互式数据可视化

使用 NumPy 和 Matplotlib 实现交互式数据可视化 在数据分析中,交互式可视化可以更好地帮助我们探索和理解数据。虽然 Matplotlib 是静态绘图库,但结合一些技巧和 Matplotlib 的交互功能(widgets、event handlers),我…

Git创建和拉取项目分支的应用以及Gitlab太占内存,如何配置降低gitlab内存占用进行优化

一、Git创建和拉取项目分支的应用 1. 关于git创建分支, git创建分支,可以通过git管理平台可视化操作创建,也可以通过git bash命令行下创建: A. 是通过git管理平台创建: 进入gitlab管理平台具体的目标项目中&#xff…

mac电脑设置chrome浏览器语言切换为日语英语等不生效问题

在chrome中设置了语言,并且已经置顶了,但是不生效,在windows上直接有设置当前语言为chrome显示语言,但是mac上没有。 解决办法 在系统里面有一个单独给chrome设置语言的: 单独给它设定成指定的语言,然后重…

Find My平板键盘|苹果Find My技术与键盘结合,智能防丢,全球定位

‌平板键盘的主要用途包括提高输入效率、支持轻量化办公、提供丰富的文本编辑功能以及快捷操作。相比于直接在屏幕上打字,使用键盘可以显著提升输入速度,减少输入错误,特别是对于需要大量文字输入的场景,如写作、记录笔记等‌。平…

如何在算家云搭建GPT-SOVITS(语音转换)

一、模型介绍 GPT-SOVITS是一款强大的小样本语音转换和文本转语音 WebUI工具。它集成了声音伴奏分离、自动训练集分割、中文ASR和文本标注等辅助工具。 具有以下特征: 零样本 TTS: 输入 5 秒的声音样本并体验即时文本到语音的转换。少量样本 TTS&…

【linux网络编程】| 网络基础 | 解析IP与Mac地址的区别

前言:本节内容讲解一些网络基础相关的知识点, 不涉及网络代码!同样的本节内容是作为前一篇的补充知识点, 前一篇文章地址:【linux网络编程】 | 网络基础Ⅰ| 认识网络-CSDN博客,本篇文章内容较少&#xff0c…

Unreal Engine5安装Niagara UI Renderer插件

系列文章目录 文章目录 系列文章目录前言一、如何下载安装Niagara UI Renderer插件 前言 在2024.10.24号的今天发现unreal engine官网已经没有虚幻商城了,取而代之的是FAB ‌虚幻商城已经停止运营,Epic Games推出了新的数字资产商店FAB。‌ Epic Games…

重构商业生态:DApp创新玩法与盈利模式的深度剖析

随着区块链技术的发展,DApp(去中心化应用)正在从实验走向成熟。DApp以去中心化、透明性和不可篡改性为基础,结合智能合约,逐步改变传统商业运作模式,创造新的市场生态。本文将从DApp的独特优势、创新玩法和…

解决Docker部署ocserv的时候,遇到客户端经常重连问题

本章教程,主要介绍在Docker部署ocserv的时候,客户端连接的时候,会出现每4分钟重连问题。 解决办法 这是ocserv的核心配置文件ocserv.conf,它通常是在/etc/ocserv/目录下,主要影响每4分钟重连的参数是auth-timeout,单位是秒,原本这个默认值是240,经过单位换算,恰巧等于…

AI赋能R-Meta分析核心技术:从热点挖掘到高级模型、助力高效科研与论文发表

Meta分析是针对某一科研问题,根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法,对来源不同的研究成果进行收集、合并及定量统计分析的方法,现已广泛应用于农林生态,资源环境等方面,成为Science、Nature论文的…

MySQL 初阶——多版本控制 MVCC

一、版本链(undo 日志) a. 什么是版本链 版本链就是一条以事务为节点的单链表。其 next 指针指向前一个版本的事务。 b. 版本链的增删 当一个事务被完成时,这个事务就会被加入到版本链里去;当要回滚时,版本链就会删…

微服务网关Zuul

一、Zuul简介 Zuul是Netflix开源的微服务网关,包含对请求的路由和过滤两个主要功能。 1)路由功能:负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础。 2)过滤功能:负责对请求的过程…

多元线性回归【正规方程/sklearn】

多元线性回归【正规方程/sklearn】 1. 基本概念1.1 线性回归1.2 一元简单线性回归1.3 最优解1.4 多元线性回归 2. 正规方程求最优解2.1 线性回归的损失函数(最小二乘法)2.2 推导正规方程2.3 正规方程练习2.4 使用sklearn计算多元线性方程2.5 凸函数 3. 线…

masm 6.15下载及DOSBox自动挂载

这里写目录标题 工具参考masm下载准备自动挂载 工具 系统:Windows 11 应用:DOSBox 0.74-3 masm 6.15文件 参考 DOSBox 下载安装教程:本人写的《DOSBox下载安装(Windows系统 DOSBox 0.74-3)》 https://blog.csdn.ne…