【Java--数据结构】二叉树

news2024/9/22 15:40:06

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



树结构

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合

注意:树形结构中,子树之间不能有交集,否则就不是树形结构

常见概念 

 节点的度:一个节点含有子树的个数,如A的度为6

树的度:一颗树所有节点的度的最大值,如上图中树的度为6

叶子节点(终端节点):度为0的节点,如P,Q节点

父节点(双亲节点):有子节点的节点,如A是B的父节点

子节点(孩子节点):与父节点相反,如B是A的子节点

根节点:没有父节点的节点,如A

节点的层次:从根节点为第1层 ,往下数,以此类推。

树的高度:树的最大层次数,如上图树的高度为4

树的应用

 二叉树

一棵二叉树是结点的一个有限集合,该集合: 为空或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成

 注意:每个节点最多有两颗子树,且有左右之分。

 二叉树的各种情况

满二叉树 与 完全二叉树

满二叉树:每层的节点都达到最大值。(若满二叉树的层数为k,则节点个数为2^K-1)

完全二叉树:每一层从左到右数,直到最后一个节点的前面必须是满的。(满二叉树是特殊的完全二叉树)

二叉树的性质:

前、中、后、层序遍历

前序遍历:根、左、右

中序遍历:左、根、右

后序遍历:左、右、根

层序遍历:从上到下,从左到右,依次遍历 

创建二叉树

二叉树的节点

public class TestBinaryTree {
    static class TreeNode{
        public char val;
        public TreeNode left;
        public TreeNode right;

        public TreeNode(char val){
            this.val=val;
        }
    }
}

 手动搭建一个二叉树

    public TreeNode createTree(){
        TreeNode A=new TreeNode('A');
        TreeNode B=new TreeNode('B');
        TreeNode C=new TreeNode('C');
        TreeNode D=new TreeNode('D');
        TreeNode E=new TreeNode('E');
        TreeNode F=new TreeNode('F');
        TreeNode G=new TreeNode('G');
        TreeNode H=new TreeNode('H');

        A.left=B;
        A.right=C;
        B.left=D;
        B.right=E;
        E.right=H;
        C.left=F;
        C.right=G;

        return A;
    }

    public void preOrder (TreeNode root){
        if(root==null){
            return;
        }
        System.out.print(root.val+" ");
        //递归遍历左子树
        preOrder(root.left);
        //递归遍历右子树
        preOrder(root.right);
    }

    public void inOrder(TreeNode root){
        if(root==null){
            return;
        }
        inOrder(root.left);
        System.out.print(root.val+" ");
        inOrder(root.right);
    }
    public void postOrder(TreeNode root){
        if(root==null){
            return;
        }
        postOrder(root.left);
        postOrder(root.right);
        System.out.print(root.val+" ");
    }

测试

        TestBinaryTree testBinaryTree=new TestBinaryTree();
        TestBinaryTree.TreeNode root= testBinaryTree.createTree();
        testBinaryTree.preOrder(root);
        System.out.println();
        testBinaryTree.inOrder(root);
        System.out.println();
        testBinaryTree.postOrder(root);

根据 前序遍历 和 中序遍历

或者 后序遍历 和 中序遍历 可以创建二叉树

而 前序 和 后序 不能

获取整棵树的节点数size

子问题思路

左子树节点数+右子树节点数+1=整棵树的

    //求整个树的节点个数
    public int size(TreeNode root){
        if(root==null){
            return 0;
        }
        int ret=size(root.left)+size(root.right)+1;
        return ret;
    }

遍历思路

每遍历一个节点就++


    //遍历思路
    public int nodeSize;
    public void size2(TreeNode root){
        if(root==null){
            return;
        }
        nodeSize++;
        size2(root.right);
        size2(root.left);
    }

求叶子节点的个数

子问题思路

 整棵树的叶子节点个数=左树的+右树的

    public  int getLeafNodeCount(TreeNode root){
        if (root==null){
            return 0;
        }
        if (root.right==null&&root.left==null){
            return 1;
        }
        return getLeafNodeCount(root.right)+getLeafNodeCount(root.left);
    }

 遍历思路

    public  int leafSize;

    public void getLeafNodeCount2(TreeNode root) {
        if(root == null) {
            return ;
        }

        if(root.left == null && root.right == null) {
            leafSize++;
        }
        getLeafNodeCount2(root.left);
        getLeafNodeCount2(root.right);
    }

 计算第k层有多少个节点

已知前提:k是合法的


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

 求树的高度

整棵树的高度=Math.max(左树的高度和右树高度)+1

    //求树的高度
    public int getHeight(TreeNode root){
        if(root==null){
            return 0;
        }
        int leftHeight=getHeight(root.left);
        int rightHeight=getHeight(root.right);
//        return Math.max(leftHeight,rightHeight)+1;
        return leftHeight>rightHeight?
                leftHeight+1:rightHeight+1;
    }

找值为val的节点

//    找值为val的节点
    public TreeNode find(TreeNode root,char val){
        if(root==null){
            return null;
        }
        if(root.val==val){
            return root;
        }
        TreeNode ret=find(root.left,val);
        if(ret!=null){
            return ret;
        }
        ret=find(root.right,val);
        if(ret!=null){
            return ret;
        }
        return null;
    }

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

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

相关文章

Java爬虫安全策略:防止TikTok音频抓取过程中的请求被拦截

摘要 在当今互联网时代,数据采集已成为获取信息的重要手段。然而,随着反爬虫技术的不断进步,爬虫开发者面临着越来越多的挑战。本文将探讨Java爬虫在抓取TikTok音频时的安全策略,包括如何防止请求被拦截,以及如何提高…

HTTPS请求头缺少HttpOnly和Secure属性解决方案

问题描述: 建立Filter拦截器类 package com.ruoyi.framework.security.filter;import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.…

YOLOv8目标跟踪deepsort

原文:YOLOv8目标跟踪deepsort - 知乎 (zhihu.com) 一、YOLOV8 tracking 参考文章: Ctrl CV:YoloV5 + DeepSort1 赞同 0 评论文章 二、行人重识别(ReID) ——Market-1501 数据集 2.1、数据集简介 Market-1501 数据集在清华大学校园中采集,夏天拍摄,在 2015 年构建并…

儿时插画:成都亚恒丰创教育科技有限公司

儿时插画:穿越时光的色彩梦境 在记忆的长河中,总有一些画面如同璀璨星辰,不因岁月的流逝而黯淡,反而在心底愈发鲜明——那便是儿时插画中的世界。它们不仅仅是纸上的色彩与线条,更是通往纯真年代的秘密通道&#xff0…

前端框架入门之Vue的模版语法与数据单向绑定 数据双向绑定

目录 vue的模版语法 数据绑定 vue的模版语法 关于模版这个概念 root容器里面被称为模版 我们的语法分为插值语法和插值语法 这样就是实现了插值语法 接下来我们实现指令语法 首先我们写一个a标签 链一个超链接上去 <h1>指令语法</h1><a href"https:/…

[Linux+git+Gitee+Jenkins]持续集成实验安装配置详细

首先理解持续集成原理&#xff0c;看懂并理解图 1。 图 1 持续集成原理结构 图 1 中&#xff0c;版本控制服务器指远程代码仓库&#xff0c;本实验使用 GitEE 作为远程代码仓库&#xff1b;Jenkins 自动化部署服务器为虚拟机&#xff0c;操作系统为 Linux &#xff1b…

学习大数据DAY17 PLSQL基础语法6和Git的基本操作

目录 包 存储过程调试功能 作业 阶段复习作业 Git课程目录 什么是版本控制 没有版本控制的缺点 常见的版本工具 版本控制分类 1. 本地版本控制 2. 集中版本控制 3. 分布式版本控制 Git与SVN主要区别 Git软件安装及配置 Windows系统安装Git 安装Tortoise Git(乌龟…

Linux网络编程-socket套接字使用详解

1.概念 在Linux中&#xff0c;套接字&#xff08;socket&#xff09;是一种通信机制&#xff0c;用于实现不同进程之间或同一主机上的不同线程之间的数据交换。它是网络编程的基础&#xff0c;允许应用程序通过网络进行通信&#xff0c;也可以在同一台机器上的不同进程间进行通…

web自动化测试selenium的基本使用

目录 初始化浏览器并打开网页 定位网页元素 定位的方法 模拟键盘操作 模拟鼠标操作 xpath方法 xpath结点 路径表达式 轴 selenium是一个很流行的自动化测试的库&#xff0c;主要用于模拟浏览器的运行&#xff0c;是web应用测试的工具。 在使用selenium时&#xff0c;…

QSpice-(4) 层次化电路设计

QSpice-(4) 层次化电路设计 在电路规模日渐庞大的现在&#xff0c;单靠一个人把整个电路做完可能还有点麻烦&#xff0c;但也不是不可能&#xff0c;还是要怀揣着那种热情把电路做好,在电路规模比较大的时候我们通常会将电路放到子电路里面去&#xff0c;这个子电路相当于C代…

数据结构——线性表(C语言实现)

写在前面&#xff1a; 在前面C语言的结构体学习中&#xff0c;我提及了链表的操作&#xff0c; 学习数据结构我认为还是需要对C语言的数组、函数、指针、结构体有一定的了解&#xff0c;不然对于结构体的代码可能很难理解&#xff0c;特别是一些书籍上面用的还是伪代码&#xf…

Python 实现股票指标计算——RSI

RSI - 相对强弱指标 1 公式 1.1 第一种计算公式 假设A为N日&#xff08;N一般取值为6、14、21&#xff09;内收盘价的正数之和 B为N日内&#xff08;N一般取值为6、14、21&#xff09;收盘价的负数之和乘以&#xff08;-1&#xff09; 这样&#xff0c;A和B均为正&#xf…

小红书笔记怎么写才能上热门?

文末领取小红书电商开店运营教程&#xff01; 小红书作为一个拥有亿级用户的社交电商平台&#xff0c;无数人通过这里分享自己的生活点滴和购物心得。 你是不是也想让自己的小红书笔记上热门&#xff0c;获得更多的曝光和关注呢&#xff1f; 今天&#xff0c;我们就来揭秘一…

2024最新MidJourney设计Logo教程+提示词原理

你是否已经看过许多别人分享的 MJ 咒语&#xff0c;却仍无法按照自己的想法画图&#xff1f;通过学习 MJ 的提示词逻辑后&#xff0c;你将能够更好地理解并创作自己的“咒语”。本文将详细拆解使用 MJ 设计 Logo 的逻辑&#xff0c;让你在阅读后即可轻松上手&#xff0c;制作出…

应急靶场(2):Windows Server 2022 - Web1

目录 一、攻击者的shell密码 二、攻击者的IP地址 三、攻击者的隐藏账户名称 四、攻击者挖矿程序的矿池域名(仅域名) 五、有实力的可以尝试着修复漏洞 下载好靶场&#xff08;前来挑战&#xff01;应急响应靶机训练-Web1&#xff09;并搭建好环境&#xff0c;无需密码直接进入靶…

[Spring] Spring Web MVC案例实战

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

【堆 优先队列 第k大】2551. 将珠子放入背包中

本文涉及知识点 堆 优先队列 第k大 LeetCode2551. 将珠子放入背包中 你有 k 个背包。给你一个下标从 0 开始的整数数组 weights &#xff0c;其中 weights[i] 是第 i 个珠子的重量。同时给你整数 k 。 请你按照如下规则将所有的珠子放进 k 个背包。 没有背包是空的。 如果第…

数据采集监控平台:挖掘数据价值 高效高速生产!

在当今数字化的时代&#xff0c;数据已成为企业非常宝贵的资产之一。然而&#xff0c;要充分发挥数据的潜力&#xff0c;离不开一个强大的数据采集监控平台&#xff0c;尤其是生产制造行业。它不仅是数据的收集者&#xff0c;更是洞察生产的智慧之眼&#xff0c;高效高速处理产…

韦东山嵌入式linux系列-驱动进化之路:总线设备驱动模型-课后作业

在内核源码中搜索 platform_device_register 可以得到很多驱动&#xff0c;选择 一个作为例子&#xff1a; ① 确定它的名字 ② 根据它的名字找到对应的 platform_driver ③ 进入 platform_device_register/platform_driver_register 内部&#xff0c;分析 dev 和 drv 的匹配过…

[WUSTCTF2020]level4题解 入土为安的第三天

二叉树 Practice my Data Structure code..... Typing....Struct.....char....*left....*right............emmmmm...OK! Traversal! Traversal type 1:2f0t02T{hcsiI_SwA__r7Ee} Traversal type 2:20f0Th{2tsIS_icArE}e7__w Traversal type 3: //type3(&x[22]); No w…